If you’re doing networked multiplayer keep this in mind: GameInstance vars will persist for the server, but GameInstance is not replicated to clients.
So what I often do in your situation (if networking) is I create the same variables in GameInstances as I do in GameState, for the ones that need to both carry over between level changes AND need to replicate to clients. then when GameState BeginPlay, if Is Server, I copy whatever is in the GameInstance over to the GameState.
the GameInstance does not persist between runs of the game, though, only between level opens.
so to persist data between game runs you must store as a config variable, use unreal Save object(s), or come up with another solution.