I've joked with coworkers that our entire job as programmers is to find ways to light up pixels on someone's screen in patterns that they find pleasing.
I've been working on a survival/RTS game and it's funny that even though the game development framework I'm using (Unity) tends to push you to put most of the code on the visual objects level and that was my original approach, over time I've figured out the whole code is way cleaner and works better (in other words, the best architeture for that software) when almost all of the game is really just a Data layer being manipulated by the player and a separated View layer for the players to visualized it in a nice way - basically a Model-View Controller Architecture, same as you'll find in systems were a server-side application has web and/or smart app UIs.
That said, I have the impression that something like an FPS is a lot less data-driven than an RTS because things like the 3D models that make up the world are a lot more important for data decisions (has the bullet hit an object, can the player move to this position). You can still say that stuff is data (3D models are data, specifically collections of vertices in 3D space with some additional information attached), but model data is generally way more visualization-oriented than what one could metaphorically call a "database".
Whilst composition over inheritance is indeed the way to go (and if you read the original Design Patterns book, it's part of the things they talk about in the beginning well before they go into patterns), ECS just distributes the data all over the place which tends to create bugs due to implicit dependencies that are not very visible because things are distributed (so when you change something, other stuff elsewhere might break).
The point of ECS is performance with large numbers of similar entities, rather than being a good architecture in software engineering terms (i.e. resilent to bugs, not brittle when changed, easy to understand as whole and so on).
My impression, having come from totally different areas of software development (server-side, web, smartphone apps, desktop apps) is that Game Development isn't all that sophisticated in the terms of Software Architectures, maybe because it's too close to the metal, too concerned with performance and mainly the playground of young devs who, frankly, lack the experience to have reached the level of being aware of software development as a process and how to design and develop software in such a way as to improve the outcomes of that process.
and even if some idiot put every zombie npc in a database (or if you want to think of it that way), you wouldn't just delete the rows! the bodies would disappear, so instead you would update that row like (npcState = KIL, bodyLocation = <some coords>) or something. Especially if you wanted to keep player stats
Maybe you would have an array of active enemies in RAM, and when enemies are killed they are removed from that array for example?
In a game like Minecraft for example, you definitely wouldn't want to store every single dead entity and its location when there can easily be thousands created and destroyed in a single second
I was looking at the savegames from the game control recently, it's kinda funny because you open them in notepad, you see a bunch of random gibberish from bad decoding (the game uses a proprietary save format) with the words "collected" "Collected" "unlocked" "available" "VariableRestoreHack" (??) "STATE_B_PUZZLE_SOLVED" "Powercore_Not_Attached" randomly interspersed
Like, surely there is a better way to store 2 state data other than an english word?
It does generally get longer as you play, but also "locked" just switches to "unlocked" for example when you unlock something
There for a minute when Dyson Sphere Program first went into open pre-release, something was wrong with their save file compression, and very quickly people were reporting multiple GB saves.
This reminds me of when I found a project combining Quake and SNMP, you walked around on a map with the routers and switches on the network and you have different guns representing different tools, you could shoot a router/switch with one gun and it would ping it, another gun with run a traceroute, a third would reboot it and so on.
What if killing the zombies is actually alleviating processing power where the server and database are able to function better because you are eradicating the zombies. Technically, that's world conservation