Сложность, запутанность кода -> одно из естественных следствий развития проекта.
Как держать сложность в разумных предлах - об этом все эти ООП, SOLID, микросервисная архитектура и тд.
Но суть везде схожая -> разделить один запутанный код на независимые части (функциональные блоки, модули, микросервисы), которые проще понять, проще развивать, переиспользовать, переделывать, или вообще заменять другими модулями.