Writing down and graphing out these relationships is a good way to identify and normalize them.
I once had a system with layers of functionality; lvl 0 services were the most critical; lvl 3+ was "user shit" that could be sloughed off at need.
Had some stub servers at lvl 0 and 1 that did things like providing a file share of the same name as the lower level services, but not populated; so that inadvertent domain crossing dependencies weren't severe problems.
There was a "DB server" stub that only returned "no results." The actual DB server for those queries was on the monster big rack SPARC with the 3dz disks that took 10min to spin up fully. When it came up it took over.
I’m really glad we realized that before disaster struck. We have a project in-progress to do exactly this. It’d even better if SWE wrote ADRs (or whatever) that document all this stuff up front, but … well, there are only so many battles anyone can fight, right?