The 20-year-old recovered from a set down to beat Norway's Casper Ruud 4-6, 6-4, 6-3 and become the youngest player to make the last four in the tournament's history.
Ruud, ranked 24th, saved three match points before double-faulting to hand Jodar victory.
After starting the season ranked 168th, the Spaniard now has a huge chance of qualifying for the ATP Finals in what has been a remarkable breakout year.
He will play 2019 Shanghai champion Daniil Medvedev in the semi-finals, after the Russian beat American Tommy Paul in the day's second quarter-final.

Click here for more on the match
It was Jodar's first match since being warned for unsportsmanlike conduct after shouting an expletive at a ball boy in the fourth round.
On Wednesday, Jodar was trailing Botic van de Zandschulp after losing the first set on a tiebreak when he shouted in Spanish: "Give me the f*cking towel!"
Jodar said Friday he knew it was wrong.
"After the match I thought about it and I shouldn't have done that to the ballkid. It was my mistake," he said after his gutsy quarter-final win.
He added that he wished to apologise to the ball boy.
"As I'm learning how to do the forehand, how to do the backhand, how to serve, I'm also learning how to behave on court, and there's still a lot of things," said the world number 13.
"I'm not perfect."
