The Berliners had twice come back from a goal down but Christian Pulisic, who scored the first goal and set up the second, earned a last-gasp penalty for Reus to convert and protect Dortmund's unbeaten run in all competitions.
The Bundesliga leaders were made to work hard against the gutsy Berliners, third in the second division, and had the 20-year-old American Pulisic to thank for the lead.
Dortmund, whose defender Abdou Diallo left the pitch injured after 13 minutes, never really found their footing until late in the first half.
Pulisic stabbed in on the rebound after Shinji Kagawa's header was saved by Union keeper Rafal Gikiewicz in the 40th minute.
Union hit the crossbar two minutes later with a superb effort by Kenny Prince Redondo and got a deserved equaliser through substitute Sebastian Polter who scored with his first touch.
Their joy lasted only 10 minutes, however, when Pulisic sent Maximilian Philipp through with a superb pass and the forward drilled in an equally stunning finish.
But Union refused to give up and were rewarded with another goal in the 88th as Polter's header wrong-footed keeper Marwin Hitz.
They hung on and soaked up the pressure in extra time before Pulisic was brought down for the penalty.
It was even harder for Schalke 04 who had to go to penalties to beat second-tier Cologne.
Karim Bellarabi struck twice for Bayer Leverkusen in their 5-0 demolition of hosts Borussia Moenchengladbach while Werder Bremen also fired five goals past lower-ranked Weiche Flensburg in a 5-1 victory.
Substitute Timo Werner scored both goals as RB Leipzig beat Hoffenheim to book their spot in the next round.
Champions Bayern Munich progressed on Tuesday with a 2-1 win at fourth division club SV Roedinghausen. (Reporting by Karolos Grohmann, editing by Ed Osmond)
(This story has not been edited by Devdiscourse staff and is auto-generated from a syndicated feed.)