I don't quite understand 'hard references' and how/why to avoid them
I keep seeing that 'hard references' such as casting should be avoided or at least reduced as much as possible, but I don't really understand why. Apparently when you hard reference an actor, everything that it references is also loaded. But in my project, I cast to game mode, game state, pawn, player controller, interactable objects... etc, and all of these actors are already in the game and referencing each other at any given time, so should casting still be avoided? Is it because references are stacked somehow and will only accumulate over time with no way to clear up the memory?
Another issue I don't understand is using event dispatchers/delegates vs directly calling a function through an actor reference. I understand that delegates are good for when you want multiple things to react to a high level event, like multiple UIs reacting to a change in game state, but what about a player controller updating the game state? To me it seems intuitive to directly call the game state's function from the PC, but that again creates hard references that apparently should be avoided.
What are the best practices around this?