Hi there!
You're correct, FE means that you, the client, cannot change any server-sided value (with the most recent update to Roblox, FE is permanently on). With remote events and functions, you can, whether the client is communicating with the server, or vice versa. Here's an example:
Script located in client-sided buttongui
1 | script.Parent.MouseButton 1 Click:Connect( function () |
2 | game.ReplicatedStorage.RemoteEvent:FireServer( "Button clicked!" ) |
Script located in ServerScriptService
1 | game.ReplicatedStorage.RemoteEvent.OnServerEvent:Connect( function (player, text) |
The server should print "Button clicked!", assuming that a remote event in located in replicated storage. This allows for the remote event to be commutative. I'd also like to mention that remote functions and events always contains a player argument. Hope this helped!