Dealing with legacy software systems is simply a reality for most developers.
It is a rare occasion when a profit-centre project is rationally, completely and deliberately designed from scratch by someone who has experience in software architecture. The vast majority of the time, the core projects that make value in an organization grow organically - starting out as a quick hack to solve a problem and growing in scope and importance as it starts to save or bring in money.
This is true for game projects as much as any other software. And it applies to Elden.
The industry's response to this trend is to embrace change and agility -- using planning approaches that are lighter weight and iterate towards an efficient solution by doing evaluations at every stage. When these two approaches clash, however, things can get nasty.
A common approach to having a large and old code base with lots of bugs and awkwardly written workarounds is to try and clear it and start from scratch. This is incredibly common, but among veteran developers it is a poorly regarded approach. It reliably results in regressions and in many cases perpetuates the very cycle it purports to solve.
The most effective way to handle this kind of transition that I've found does not use any gimmicks or fancy new organizational concepts. It is a simple and direct application of classic, old-fashioned object-oriented programming techniques. This is something that almost gets taken for granted nowadays -- OOP is such a given that very few people would profess to specialize in it. Yet this kind of transition seems to be virtually unheard of in most real-world environments.
The core concept here is to do incremental replacements of functionality using small, individual, well-thought-out modules. Rather than rewriting the codebase from scratch, you simply duplicate its functionality, a page of code at a time. Unity is fantastic for this, as it allows you to instantiate and duplicate modular components with very little effort.
In the case of game development, and Elden specifically, this means taking the large, ungainly components (primarily the player and enemy controllers) and incrementally replacing individual functions of them with smaller modules. It is 100% possible to replace the entire codebase with a faster, more stable, neater, tidier, better-factored and better-documented version -- without breaking intermediary builds or causing any other short-term pain.