The simplest is this:
get_tree().change_scene("res://path/to/scene.tscn")
Under the hood, changing scene is as simple as replacing a node in the tree by another:
# Remove the current level
var level = root.get_node("Level")
root.remove_child(level)
level.call_deferred("free")
# Add the next level
var next_level_resource = load("res://path/to/scene.tscn)
var next_level = next_level_resource.instance()
root.add_child(next_level)
root
can be any node you want. In the first simplest example, root
is the root of the whole scene tree. Once you understand how this works, you can apply this anywhere, and you'll realize "changing scene" is a relative concept. You could change everything if you do it on the root, but you can do that to a part of the tree, so that not everything has to change.
pgregory suggested background loading but it's not required to change scene. You might need it only if your scene is too big to the point of needing a loading screen.