Am I on the right track regarding architecture?

The main approach I use is interface/direct calls throughout my gameplay.

For example: Players can’t go without weapons and that is a clear interface call. Players can interact with objects - interface call. Players can enter vehicles - interface call.

Everything internal - direct call. For example calls between components in the same object or between the object and its components. This object is “This Object” because of its components.

I only use events when I need to reverse dependency or I need to create a one-way dependency between interconnected architectural layers.

For example: Actor (Gameplay Layer)->Widget (UI Layer) - The Widget receives a reference to the actor it needs to show info about and subscribes to all needed actor events. Tomorrow I can remove/delete the UI and nuke it out of the game and the rest is still intact.

The same approach I apply to each system I want to be able to remove without affecting the game - managers, quest systems. Non-essential parts that can be removed (on a dedicated server for example) and the game would still play the same.

I never have empty blueprints in the level. Unlike Unity in Unreal there are plenty of objects that are always present on the level - controllers, game state/game mode, player state, even the level can contain code so no need for empty objects really.

P.S.
Blueprints are perfectly fine. I am yet to find system that that is impossible to do with BP. I’ll admit some things are not exposed to BPs, and yes C++ is way more performant, and yes data traversal and math are a painful to look at. But then - no compile time - worth it!