No, don't duplicate any scene.
Look, You will have some weapons nodes stored in array, not childed to anything.
This is an example of how it can work :
Your menu mode has reference to array of weapon nodes, and when player chooses weapon name, subsequent weapon node becomes "current" and it sends a signal.
Wievport container node consists only of camera, light, background and empty mesh instance. It catches the signal about weapon, and mesh changes accoriding to information about this weapon.
func on_signal_sent(info)
MeshInstance.mesh = info.mesh
The player is very complicated set of nodes, but it also receives this signal, so he can adapt in-game statistics like reload time, shot damage, ammo type, zoom-in possibility, some special effects and everything, that depends on weapon type. Player also has an empty mesh, attached to the hands bone, that only changes mesh to a current weapon, nothing else.
Finally, UI element receive this signal, so all its submenus and labels can display statistics of a current weapon.
Whenever a statistic changes, for example You apply upgrade to a weapon, signal is resent, and all these nodes make changes too.
One signal comes from one node, but all amount of nodes can receive it, so nothing needs to be duplicated.