The visitors did most of the pressing in the first half and were rewarded five minutes before the interval when M'Baye Niang poked home his ninth goal of the campaign in all competitions.
Bruno Genesio's men pegged them back shortly after the restart through Bertrand Traore's unerring finish although captain Benjamin Andre restored their lead with a 55th-minute header.
Moussa Dembele drew the hosts level again from the penalty spot after 75 minutes but Ramy Bensebaini had the final say, lashing in from 18 yards nine minutes from time to book their place at the Stade de France later this month.
C'est terminé ! Le @staderennais se qualifie pour la Finale de la Coupe de France en s'imposant face à Lyon— Coupe de France (@coupedefrance) April 2, 2019
Le club Breton connaîtra l'adversaire qu'il affrontera le 27 avril au Stade de France dès demain (PSGNantes à 21h00) pic.twitter.com/3wjP9yPcwT
After a quiet opening half-hour, Nabil Fekir burst into life and twice forced Tomas Koubek into smart saves in quick succession.
The importance of those stops was highlighted shortly before the interval when Niang stole in front of Marcelo to prod home Ismaila Sarr's teasing cross from the right.
That lead was wiped out two minutes after the restart, though, as Traore collected a loose ball inside the area, took a touch and fired low into Koubek's bottom-right corner.
Anthony Lopes superbly pawed away Hatem Ben Arfa's fizzing drive soon after but there was little he could do from the resulting corner as Andre climbed highest to head home from eight yards.
Andre was involved in Lyon's leveller 15 minutes from time as referee Benoit Bastien adjudged him to have handled Houssem Aouar's shot inside the area. Dembele made no mistake from the resulting spot-kick, tucking low to Koubek's left.
With extra time looming, Bensebaini thundered home with his right foot from the edge of the area to settle an action-packed semi-final.
What does it mean? Rennes can end middling season on a high
An underwhelming Ligue 1 season will surely be consigned to memory should Rennes prevail against either PSG or Nantes in the final. They showed superb resolve to come back from a second Lyon equaliser and they may well need the same kind of spirit should they come up against Thomas Tuchel's band of superstars in Paris on April 27.
Ben Arfa proves too hot to handle
The mercurial former PSG man was at his very best, pulling Lyon's defenders all over the pitch and testing Lopes with two powerful long-range strikes. He played a pivotal role in his side's second, whipping in a delightful corner that was thumped home by Andre.
Fekir fails to sparkle
There's no doubting Lyon's captain was industrious, but he sorely lacked composure at vital times. Had he kept his cool when faced with Koubek in the first half it could well be Lyon in a first Coupe de France final since 2012.
Both sides return to Ligue 1 action on Saturday with Lyon hosting Dijon and Rennes travelling to Angers.