It really boils down to how unique you want things to be.
The GUID concept is really an "object ID", which means every instance of every object will have a unique identifier. That's useful in cases where everything in the game shares a common data structure (many MMO's), and so getting a pointer to GUID 3 and another to GUID 827711 are both useful things to do.
However, most Dikurivatives have rooms, mobs, objects, and players ALL as seperate kinds of pointers. So, if GUID 3 is a room, and GUID 3281 is an NPC, it's not useful. You'd need your lists to be all void pointers, and then you'd STILL have to look up the type so you know what to cast it back to.
Further, items are, as you said, split up by item_type, which means many of the fields will be reused for different things. Accessing a scroll's data structure without knowing it's a scroll is not useful.
If you're stuck in vnum-land, you can still use the concept of instance ID's. You just keep a unique ID for every different vnum. So, when you create a new copy of vnum 3001, perhaps it gets ID 337. Next the the game boots, you'll make another new one which might be ID 400. When a player gets one and saves it in their inventory, that ID number will remain... so while the next respawn/reboot might yield sword #922, the one the player is carrying will always be sword #400.
As for confusion between different vnum's... that's your fault, as a builder.
If you make two swords that are indistinguishable when lying on the ground, despite being different vnums, you failed. You should have either used the same sword and not had the other one, or you should have changed the descriptions of one to make it unique. Note that keywords != descriptions.