Another thing to keep in mind is that games aren't your average tax and accounting software; there isn't a well defined template of the outputs and inputs.
You can test basic things for correctness, like the math library, maybe you can have a way of integrating buildbots, to see if the change breaks other platforms. Launching the game to see if they crash older savegames. Or having special versions of the game that try to do some kind of limited/automated playtest to check dead ends or logic problems in a quest line. Maybe lint for odd stats issues.
But good luck trying to unit test a combat-based 3D sandbox RPG. There are so many possibilities that it's impossible to test them all. Developers do functional live testing and tweaking of their features until they experimentally feel good and fun, then the human QA team starts exploiting the heaps of unintended issues and they slowly get ironed out until people run out of time or it's good enough for most purposes.
But modern games are a marvel of engineering, and they need to compute, process, redraw and finish everything under 16 milliseconds without hitching.
Add to that the fact that there's a big creative part of self-discovery and seeing what's fun and works or not, so requirements (and your plan) change daily, and you have your answer.
--
Note: I'm not excusing poor-quality software. A game internally may look a bit wonky or ugly because it grows organically, but it may work as intended.
Warband's module system wasn't super pretty either, but the whole thing was comfortable to use, easy to expand and because it mixed tables of data with triggers you can add new items relatively easily without touching anything else.
At the end of the day, as long as you don't have super unreadable spaghetti code you (and modders) should be fine.
Going with decompiled C# and limiting visibility of comments and a good separation of files was a step backwards, in my opinion. Something like LuaJIT would have been a better replacement, I think. At least in the original game we had access to the whole (modular) thing, as limited and creative-workaround-prone as it was in some ways. We could delete/stub most of the logic and turn it into something else.