They will play either Bayern Munich or Borussia Dortmund, who meet on Wednesday, in the May final.
Taleb Tawath gave Frankfurt a 15th minute lead at the Borussia Park but Jonas Hofmann equalised for the hosts in first half stoppage time.
The scores finished 1-1 after 90 minutes and with an extra 30 minutes insufficient to find a winner, the semi-final went to penalties.
The first 12 spot-kicks were scored before Frankfurt goalkeeper Lukas Hradecky saved Andreas Christensen's effort for Borussia.
On-loan Manchester United full-back Guillermo Varela couldn't capitalise as Yann Sommer saved his penalty.
But Djibril Sow's spot-kick was the third in a row to be saved before Swedish midfielder Hrgota stepped up to fire home the winner.