I can feel the same frustration. I came from Unity at that time when I still considered me a indie game developer. I just loved the ECS system that Unity had, and so, I tried to re-implement it in MonoGame/.NET, and SDL/C++.
But once I got my first contract as a game developer, I ran into optimization issues. I was developing a little idle, clicker RPG beautifully (I thought) based in ECS. The game ran as hell.
After doing my research, I discovered the flaws such update-per-entity-system Unity had. And it was with almost every ECS implementation across every engine/framework.
I had to re-write entirely all the game mentioned early, costing me an expensive amount of time. I made use of Unity co-routines and .NET delegates (callbacks) to avoid Update-callbacks. Where it would only be changed a group of specific game properties when a event happened. I could improve by near 90% of the game's optimization, showing how a mess my code was prior.
After that experience, it was broken for me all the purpose the ECS had: reliability.
Afterward, if I used more than one
GameObject, it was because Unity needs them for render graphics, play sounds, do animations, and such stuff commonly not related to the game logic. And so, I just used
ScriptableObjects to make data persistent across a game session, not as another way to abstract my game components.
I believe that Entity-Component representations should be used as an abstract reference, not the implementation. Somewhat you would look at the game specification document, or level designs.
The problem with ECS and OOP paradigms directly implemented into software is that they tell us we have the necessity and mighty to re-use code everywhere, and every time. We even believe we can do it with several kind of software. But it ends costing much more than re-implementing solutions.
Now I know that a software's code only belongs to it, and it shouldn't be intended to be reused later. The only software that should have such purpose are APIs. And their interface shouldn't be as specific as an application would need. Video games are not APIs.
Instead I prefer to make use of the past knowledge and improve implementations the next time, or even better, find new ways to do it. Focus on the software functionality, effectiveness, and maintainability will be a better use of my time, rather than designing a perfect, and totally unnecessary re-writing of my perspective of life into code.