I have a morph base and I use a script to apply both the morph and a GUI to the player when the part is touched. If the player were to reset, having used the morph or not, they will still get the morph's parts and appearance back, but not the GUI.
I use this script to give the GUI using debounce, and it does give the GUI, but only if the player has not reset during the active game.
local part = script.Parent
local debounce = false
part.Touched:Connect(function(hit)
if not debounce then
debounce = true
local ptt = game.Players:playerFromCharacter(hit.Parent)
if ptt == nil then return end
local wfp = script.Parent:findFirstChild("ScreenGui"):clone()
if wfp == nil then return end
wfp.Parent = ptt.PlayerGui
wait(0.5)
debounce = false
end
end)
Players testing this have had to rejoin and, in some cases, have the server shut down as the script still wouldn't work after rejoining the active server.

1 comment
You could try setting the Gui's property, "ResetOnSpawn" to false.