Where do I have to put actions when the game state changes

GameMode should drive your game’s logic:
PlayerA scored! Let’s notify the game state that PlayerA scored, then respawn everyone and reset the ball.

GameState should give you information about the state of the game:
PlayerScored event is called. Let’s update the score counter for the players. We can read the scoring player’s name, and display it on the screen as well.

With that said, separating GameMode and GameState correctly is only needed if you are working on a multiplayer project. In that case, the server will have both a GameMode and GameState, while clients only have a GameState. Also feel free to use the GameModeBase and GameStateBase classes instead. They have less features, so that you can design a more suitable solution for your project.