Needs science. Toady did a lot of updates to trading and "world activation" since the cited research was conducted.
Is there a reliable way to iterate the total size of the item vector from dfhack? (Basically just walk the table, and give a numeric value for num_entries?)
With a quick test tool like that, I could use createitems to spawn shitloads of something directly on the depot, then trade them. I could then wait for the traders to leave, and then check again to see if the vector shrank or not.
You can query the vector about its length with #whatever_the_vector_is_called in Lua. You can also iterate over it, although you'd have to know what a dud element looks like to recognize it if DF just marks items as dud. I've seen that you can destroy items by setting a flag in them, after which DF will catch that and destroy the item. I just tried it (I have a web_buster script), and the items destroyed are removed from the "all" vector (I haven't checked the category vectors, but assume the items are removed from them as well). However, the "bad" vector did not shrink (and I found a web item in there). It's possible this vector is cleaned up when a save is loaded, though (or possibly at long intervals), as I've seen that the units.all and units.bad vectors start out the same length on a load, even if fix/dead-units had culled units before the save (so they had different lengths at that time).
A trade experiment would be useful, though. I'll see if I can find a way to investigate it from the state of the items vectors, though.
Edit: Since I trade away worn masterworks clothing, there should be enormous amounts "out there" after 30+ years. I iterated over all items in the "all" vector, and came up with 7 worn masterworks "item_helmst", not the hundreds (or thousands) of caps and hoods traded away, so they're most probably removed from the fortress, but they may well contribute to the save game size explosion...