What makes you think there’s a single skeleton in 3js?
Your screenshot shows that there is a single bone hierarchy, so no bone duplication. That’s the same thing in Babylon, you have a single bone hierarchy, which are represented by transform nodes in Babylon.
For eg, for the alien that has 4 skeletons as you mentioned:
The Root => Neck => … hierarchy is not duplicated.
Now back to the skeletons.
I have modified a 3js sample to count the number of different skeletons used by alien.glb. I simply did this:
const skeletons = [];
gltf.scene.traverse( function ( child ) {
if ( child.isMesh ) {
if (skeletons.indexOf(child.skeleton) < 0) {
skeletons.push(child.skeleton);
}
}
} );
console.log(skeletons.length);
So, it is counting the number of different skeletons: if a skeleton is shared, it is counted once only.
The number displayed is 8, which is the same as the number of skinned mesh: so there is a different skeleton for each mesh.
In Babylon for this very same scene, there are only 4 different skeletons (as you can see in the screenshot above) because some are shared among multiple meshes. As a matter of fact, if you look at the json code of the alien gltf file, you can see there are 4 entries in the skins
node: so I would say Babylon is right in this matter => 4 skins = 4 skeletons.
If you load the alien.glb file in Blender and re-export it, the new file has a single entry in the skins
node of the gltf file: so you get a single skeleton in Babylon (and still 8 in 3js). Now, why Blender does that I don’t know, but on Babylon side everything appears to be ok to me.
[EDIT]
What may have confused you is that:

For gltf/glb files, those bones are only placeholder for the transform nodes: each bone link to a transform node, the bone itself does nothing and simply copy the transform from the transform node.
[/EDIT]