Garcia, who was sent off during a 3-1 defeat by Real last month, made the most of two glaring errors from Real's Lucas Vazquez to net twice in the first half before Karim Benzema pulled one back for Real 17 minutes from time.
Athletic meet Barca on Sunday in Seville in a repeat of the 2015 final, which the Basques won 5-1 on aggregate.
The Catalans overcame Real Sociedad 3-2 in a penalty shootout following a 1-1 draw in Wednesday's first semi and beat Athletic 3-2 last week in La Liga.
"They made an excellent start while we struggled at first, we got back into the game and had our chances," said Real's Marco Asensio.
"They grew a lot after the first goal and had more belief in their play. We're sad because we wanted to reach the final but that's football and we have to move on quickly as we have more objectives to fight for."
The 34-year-old Garcia got Athletic off to an ideal start when he pounced on indecision in the Real defence to latch on to a through ball and slot into the net in the 18th minute after right back Vazquez had given the ball away.
Iker Muniain should have added a third early in the second half but missed the target with a free header and Real's Asensio hit the woodwork twice before Benzema pulled Real back into contention.
The Frenchman's strike had initially been ruled offside but was awarded after a VAR review.
Benzema put the ball in the net again and was again given offside but this time the VAR ruled against him.
Real probed for an equaliser deep into six minutes of added time and Athletic faced an agonising wait for a VAR check to be completed on a potential Real penalty but they were spared and wildly celebrated the win.
"We knew we could trust in this group of players, we were up against a great opponent but we always believed," Garcia said.