✓ Accepted answer
When someone dies, Roblox fires their humanoid.Died event if possible. You can connect this event to a function to do something upon death. Then, it waits 5 seconds (probably changeable), and essentially calls the Players:LoadCharacter() function. A model is created, assigned to the player, loads the typical parts, then loads their appearance. PlayerGui and Backpack are reset.
Countless events, properties, etc are changed, so this is a simple process but not easy to totally replicate. But yes you can take some control. You can toggle the variable game.Players.CharacterAutoLoads, then easily call Player:LoadCharacter() or Player:RemoveCharacter() whenever you want. You can also manipulate character appearance with the many properties listed in Player and Humanoid. Lastly you can disable Reset Character by running game:GetService("StarterGui"):SetCore("ResetButtonCallback", false). Have fun