You could look at this as vertical or horizontal logical structure.
Vertical means you have dependencies all the way from top to bottom. Meaning if you change anything at any level, it affects everything above.
Horizontal means usually there is very little dependency, so each of a logical part independent from each other, using some established simplistic messaging logic, to make them talk to each other.
Vertical - is much harder to maintain in long term, and makes you very dependent on legacy code. Gamedev is dynamic, meaning that you will end up with cases where you will need to change certain core aspects. And with vertical approach this will be extremely hard, as everything above it will likely break.
Horizontal - is much easier to maintain, developing you ensure you have pieces easy to change, throw, rewrite. That way you can change most of application aspects without too much overhead because of ripple effect of a change that might break a lot in vertical approach.
So separation - is good. Keeping each bit clear and simple. It is pretty much Unix philosophy - keep things small and single-purpose.