You can use an intermediate actor or actor component or subsystem to break hard referencing if using event dispatches. For example make an actor component that attaches to game mode which just has all the event dispatches.
i do like 99% of my communication using event dispatches. Actually I don’t use interfaces at all because I haven’t found a need.
To me, event dispatch is a very future friendly way to handle communication because of the 1-to-many communication style. I can add new actors and just bind them to events, no worries. It makes for a pretty easy “fire and forget” system.
On a side note, i would caution new developers to not get carried away trying to avoid hard references and decoupling unless you can demonstrate why the hard-referencing is causing a problem in your project. You stand to complicate your code considerably and slow down development a lot for no good reason. Always make sure you can explain the concrete problem that actually exist in your project before committing time to making a solution for it.