Most of the extra layers of complexity come from the interactions with blueprints and some technical debt.
The cpp isn’t just a standalone file. It has it’s .generated counterpart used to talk to the blueprint layer. All of this has the extra layer of using redirectors instead of GUID’s that can identify assets in the engine (when you move or rename assets the changes are described in redirectors).
Some of the design decisions are also geared towards larger studios where data is spread out over many systems, that’s why there is another layer of abstraction.
Could it be done better, sure. I’m guessing rewrites of major systems to clean this up would take months to years. It would break many systems along the way. Something the engineers probably don’t want to risk.
For now Epic seams to be focusing on engine performance trying to battle the infamous stuttering of shader loading / compiling.
I’m all for simplifying things. The less moving parts the less things can break, but I am just a user like you sitting at the sidelines.
On the other hand as a programmer of systems myself I also know how tough refactoring can get when your codebase is millions of lines of code.