I have the same issue and I solved it this way as I wanted to perserve the state of the first Scene while in the second Scene.
First Scene "Main" has a button connected to this function.
func _ConfigUnit():
#Called to change to new Sceen
var TheRoot = get_node("/root") #need this as get_node will stop work once you remove your self from the Tree
var ThisScene = get_node("/root/Main")
GlobalGameData.PreviousScreen = ThisScene #variable in Autoload script
#print(ThisScene)
#ThisScene.print_tree()
TheRoot.remove_child(ThisScene)
var NextScene = load("res://ConfigUnit.tscn")
NextScene = NextScene.instance()
TheRoot.add_child(NextScene)
Then in the next Scene i have button linked to this:
func _BackButton():
var TheRoot = get_node("/root") #need this as get_node will stop work once you remove your self from the Tree
var ThisScene = get_node("/root/Node2D")
TheRoot.remove_child(ThisScene)
ThisScene.call_deferred("free")
var NextScene = GlobalGameData.PreviousScreen
TheRoot.add_child(NextScene)