This is a render pipeline thing, that's true for Unity and true for any other engine that needs to use DirectX/OpenGL.
When the game engine needs to render a piece from a different texture, it needs to give extra commands and/or new data to the graphics card. That's what each material in the array represents.
So when your Skeleton's draw order requires that you render:
head parts from tex1, then
arm parts from tex2, then
torso parts from tex1, then
leg parts from tex3, then
arm parts again from tex2
You'll get a list of mat1, mat2, mat1, mat3, mat2.
Each time it needs to switch textures, it needs a new material in the array.
So.
(1) It's not a bug. This is how rendering code needs to work. Pretty much anywhere. Not just Spine. Not just Unity.
(2) It doesn't mean your asset files are being duplicated. This has nothing to do with that. It only represents the number of times the MeshRenderer has to switch between materials/textures.
(3) If there's enough items in that list, it CAN slow down your game. Because sending extra instructions to the GPU does have a bit of cost.
If it's only 10 or 15 material items there for your one main character, don't worry about it. That's not a big deal. Even on mobile.
If this character is spawned several times, consider packing 1 large texture instead of 3 small ones. Because 120 draw calls instead of 8 is arguably not okay.
Also for reference to anyone else reading this in the future: How to use the multi materials in a character ?