Nadal fought past 36th-ranked Mariano Navone of Argentina 6-7 (2-7) 7-5 7-5, having led 5-2 in the deciding set.
Some brilliant tennis between the two forced a first-set tie-break, where the Argentine powered his way into the lead.
After breaking twice in the second set to lead 3-0, Nadal then lost four games in a row as his level dropped dramatically.
Nadal broke again to make it 6-5 and was then able to hold his nerve to level the match.
The 22-time Grand Slam winner failed when serving for the match at the first attempt, but closed out the tie at the second time of asking.
"I lost for some moments my concentration, but I was able to hold physically until the end," Nadal said in an on-court interview. "That is so important for me. Let's see how I am tomorrow, but today I am alive and in the semi-finals."
The 38-year-old Nadal is playing his first tournament since losing in the French Open first round, to prepare for the Paris Olympics on clay at Roland Garros.
In his first semi-final since 2022 Wimbledon, Nadal will face Croatian qualifier Duje Ajdukovic on Saturday.