Some things or situations are inherently complex to handle and you may still want software for them (especially because they are complex). Simple code won't usually handle complex stuff, and you may still need quality.
Now you should reach for simplicity. Which may itself be complex to define.
But never complicated code: crufty fixes upon fixes, too many layers of indirection, templates templating templates; you won't need that to solve complex problems.
Three levels seems good: a solid foundation of high-quality library code; working application code on top of that; dirty workarounds on top of that.
As you say, the problem comes when you stack workarounds on top of workarounds.
I think you are confused about what simple code means.
(but I'm totally happy with isoprophlex's answer actually)
Most any software can be broken down in a modular way so that the units could be understood by a junior and you'd rarely need to think about more than one cluster of interactions at once. Maybe this is naive, but up until now found it to be true - that said, I never worked in rocket science.