Network Communication and Good Practice

Hello everybody,

I know some basics abut replication, but am still confused on how to handle the communication between the player and server, especially between PlayerController, GameInstance, GameMode and GameState.
I want the server to be dedicated.
Let’s say i have a main menu level, where the player can select which type of Character he wants to play and directly joins another level (level1).

Is it good practice to tell the GameMode from the controller, which character he plays and GameMode tells this to GameState, which stores the information to spread it to the other players?
And how can I have this information persistent on the server through levels? GameInstance seems not to work here, because it’s not replicated.

Thanks for your help.