remove_child are some of the common methods you need to know when beginning with Godot, and they do two specific things. They are both mentionned in tutorials, as well as in the doc:
queue_free() is essentially a shortcut for destroying a node safely at the end of the frame and also removes it from tree. It does not happen immediately to avoid some tricky situations that would otherwise cause the game to crash. For example, your script receives a message, you destroy the node, but... what if the code that called your script in the first place might have been the node itself, or is using that node somewhere up the call hierarchy. And if you destroy it immediately... the caller will access garbage memory. So to keep things simple, it's good practice to use
queue_free() for nodes in the tree. "queue" stands for putting the node in a list of "things to delete when the game finished processing at this frame".
free() exists if you want to destroy the node immediately. But be careful about what I said above if you decide to use it, just know what you are doing. It can be useful if you have a node already outside the tree for example.
remove_child is different: it's only a subset of what
queue_free does. It just removes a node (or branch of nodes) out of the tree. This effectively "removes them from the world", without actually loosing their data, and this can be useful in some scenarios. For example, you might want to enter a house, but remember the state of the outside map: remove the map from the tree, add the house, but without destroying either of them. You can then swap nodes in and out.
Adding and removing nodes from the tree is not useless at all, it's just the way Godot handles the scene tree and there are use cases for them. If you think you don't need it, just don't use it.