The Belarusian second seed triumphed 1-6, 7-5, 7-6 (7/5) and will face world number one Iga Swiatek on Saturday in a rematch of last year’s final.
The clinical Swiatek earlier eased past American Madison Keys with a comfortable 6-1, 6-3 victory.
In the men’s draw third seed Daniil Medvedev retired injured from his quarter-final clash with Jiri Lehecka.
Kazakh Rybakina dominated a below-par Sabalenka in the first set with two breaks, but faced far stiffer resistance in the second after going a break up in the third game.
Two-time Australian Open champion Sabalenka put heavy pressure on the fourth seed’s serve and eventually cracked it to pull level at 4-4.
Rybakina hit back instantly but seemed rattled when serving for the match and world number two Sabalenka broke again for 5-5 and then claimed the next two games to force a deciding third set.
The players exchanged holds with just one break point reached — Sabalenka staying firm for a 6-5 advantage — before the tie-break.
Sabalenka, 25, sealed her victory with a typically powerful serve that Rybakina could not control.
Rematch
Swiatek has a 6-3 record against Sabalenka but in their only match in the Spanish capital, the latter triumphed in three sets a year ago to claim the title.
Dominant on clay, Swiatek barely put a foot wrong against Keys, making just eight unforced errors in the match to leave the 29-year-old American with virtually no chance.
“I’m really happy that I had such a solid game today,” Swiatek said on court after reaching her 11th WTA 1000 final.
“Madison is an amazing player with a really fast game and a big serve, so I wanted to focus on myself and I’m happy I was focussed.”
The top seed, triumphant at Doha and Indian Wells, started in unforgiving form, taking the first set in 31 minutes.
Keys was more competitive in the second but Swiatek took it with two breaks.
Medvedev hurt
Russia’s Medvedev struggled through to the end of the first set against Lehecka with an apparent upper thigh problem, losing it 6-4 before retiring.
The Czech progressed to his first Masters 1000 semi-final, where he will face Felix Auger Aliassime, who received a walkover after top seed Jannik Sinner withdrew Wednesday with a hip problem.
“If I were to choose the way how to win this match, it wouldn’t be like that,” said Lehecka.
Medvedev took an off-court medical time-out after the fifth game, all holds of serve, and when he returned clearly had problems moving freely around the court.
The world number four saved two break points to hold for a 4-3 lead as Lehecka floundered, despite playing through obvious pain.
The Czech, who knocked-out Rafael Nadal on Wednesday, settled down and capitalised on Medvedev’s woes to break decisively in the ninth game for a 5-4 lead.
Medvedev won just four of the last 16 points before deciding to call it a night, with fans left disappointed. The other men’s quarter-final set for Thursday had been cancelled after Sinner’s withdrawal.
The 28-year-old Medvedev is the defending champion at the Italian Open, which starts next week, while the French Open, the season’s second Grand Slam event, gets underway in just over three weeks’ time.
“It would be good to come back (to Rome) after winning last year, but (I) just need to see what it is, because right now I basically don’t know if it’s very serious, just serious, or not serious — no idea,” Medvedev told reporters.
Taylor Fritz will face Andrey Rublev in the other semi-final on Friday, after the Russian ousted home favourite Carlos Alcaraz on Wednesday.