Real reason: the switch isn't free.
Going from monolith to microservices means months of new integration code, separate repos, coordinated deploys for every change, and a whole new layer of error handling per service call. None of that ships features.
@syssignals is right about the operational tax but that's the cost after you switch. The bigger problem for most companies is the cost of switching. Every interface between modules has to become an API. Every function call becomes a network call with retries, timeouts, and versioning. You don't just redeploy you rewrite.
Monoliths keep running not because nobody wants to scale. They keep running because the engineering effort required to move is too large to justify without a burning platform.
The real fix is making the transition incremental: module boundaries that work identically in-process and as remote services. Split one module at a time, no big bang rewrite. That's the architecture decision that actually costs nothing to change later.
academy.graftcode.com/quick-…