Visual tools can help here, because developers take shortcuts and you’re never developing in the perfect case, so you often end up with coupling that shouldn't be there, which creates extra complexity and in general, a "mess".
On the other hand, you can take a "bottom-up" approach to building stuff, in which you're you're building layer upon layer, such that top layers depend on bottom layers, but never the other way around. You do this by designing for each layer a domain specific language for that layer, which layers at the top can use  .
And visual tools don't really help in such a case, but on the other hand visual tools aren't really needed. In my opinion visual tools for software development (and I'm thinking primarily of UML here) are just fixing a symptom instead of the real disease, giving you a wider window for building a mess.
 it can be argued that Unix was built like this