Best approach for Multiplayer Data thing

If we talk specifically about inventory, then it is better (in my opinion) to create a separate replicated actor for it.
Storing inventory data in Game Instance or Game Mode is clearly not worth it, at least for the reason that they are not replicated as well as widgets, and Game Mode only exists on the server at all.

As for interaction, it should look something like this:

The player presses the “E” button → an “interaction” RPC is sent to the server → the server checks whether there is an item in front of the player ON THE SERVER, and if so, it adds information about the object to the inventory and removes the object from the level (or moves the object to a non-game zone if FPS drops when creating/removing the object), and sends the changed data to the database → the RepNotify function is triggered in the client’s inventory → the inventory widget changes in accordance with the current data.

When a player takes something out of the inventory, an RPC is sent to the server indicating from which cell of the inventory the item should be taken → the server checks whether the item is in the specified cell, deletes the information from the inventory actor, sends new data to the database, creates a new actor at the level → NetLoadOnClient of the created actor automatically creates its copy on the client, the RepNotify function is triggered in the inventory actor on the client - the inventory widget changes.

If the database is a kind of save file, then for optimization purposes it is better to take information from it after starting the game server, and send the latest relevant data before closing it.