... it is frustrating that when one thing gets fixed, often another gets broken
That's normal for any game (or application) that uses a hierarchical code model, e.g. OO in C* (which includes C++/C#/Java). One bug (or new feature) could cause an underlying game service or module to change. Then the bug fix (or feature change) will affect all of its (many) callers, not just that one. So one code change to fix one thing may also cause 10-200+ other visible changes elsewhere.
Testing a complex system for behavior changes after code tweaks can be massively nonlinear in the size of the tweak. Combinatorial explosion of testable cases quickly overwhelms the developers' internal efforts. (And from the business pov, you don't want to pay costly top-flight programmers to do mundane testing.)
One of the primary jobs of Beta testers is to cast eyeballs and footprints over that combinatorial space. Somebody's going to do it, either us now or a paying customer 2 years after release 
The benefit of a well-modularized code base is that the developers' productivity also increases combinatorially (or so we strive!).