Here's a quick trigger I made that accomplishes the task.
-
Research
-

Events
-


Unit - A unit Finishes training a unit
-

Conditions
-


Or - Any (Conditions) are true
-



Conditions
-




(Unit-type of (Trained unit)) Equal to (Some_Technology)
-




(Unit-type of (Trained unit)) Equal to (Some_Other_Technology)
-




(Unit-type of (Trained unit)) Equal to (Some_Other_Other_Technology)
-

Actions
-


Set UNIT_ResearchedTechnology = (Trained unit)
-


Unit - Move UNIT_ResearchedTechnology instantly to (Center of (Your_Region_Here)) <gen>)
-


Unit - Hide UNIT_ResearchedTechnology
-


Player - Make (Unit-type of UNIT_ResearchedTechnology) Unavailable for training/construction by (Owner of (Triggering unit))
-


-------- // the rest of this is optional and just plays the "research complete" sound to the player --------
-


Custom script: set udg_PLAYER_LocalPlayer = GetLocalPlayer()
-


If (All Conditions are True) then do (Then Actions) else do (Else Actions)
-



If - Conditions
-




PLAYER_LocalPlayer Equal to (Owner of (Triggering unit))
-



Then - Actions
-




Sound - Play ResearchComplete <gen>
-




Game - Display to (Player group(PLAYER_LocalPlayer)) the text: Research Complete!
-



Else - Actions
Some_Technology,
Some_Other_Technology, etc., these are just units that you create that act as upgrades. This means that if you already had a bunch of upgrades made for your map, sorry, if you want to queue them you'll have to convert them all into units!
UNIT_ResearchedTechnology is a Unit variable which we set to the trained unit. The trained unit by the way is just some custom unit that acts as an upgrade. Nothing really matters about the unit's stats, model, or appearance, except the training time, tooltip, and gold/lumber cost, since it is behaving as an upgrade.
"Your_Region_Here" is just some region that's out of the way of gameplay, e.g., in a corner of your map protected by Boundaries. This is sort of an unnecessary step because a hidden unit can't cause too many problems, but its better safe than sorry.
We make the unit unavailable after it has been trained, because then you can't make multiple of the same upgrade.
Everything below the comment (
the rest of this is optional) is optional. It plays a sound and gives a message to the player who finished training the unit. If your map is a single player map, you don't need to worry about the custom script and if/then/else function; you can just play the sound and deliver the message to all players.
If your upgrades have levels, you could also simulate that by tweaking with the "Make unit available" triggers (make the next upgrade unit, which is disabled at map initialization, available after a certain upgrade unit finishes training).