The top seed took 10 games in a row to win 4-6 6-3 6-0 and set up a final against Lucie Safarova on Saturday.
Williams, 33, has been unwell throughout the tournament and struggled as temperatures soared in Paris.
"I don't think I've ever been this sick," Williams told ESPN. "I didn't expect to win that, I really didn't."
She added: "I got the flu after my third-round match and I've been really struggling ever since then. Hopefully this is the worst and I'll get better from here.
"I thought, 'If I'm going to lose, I'm going to go for winners.'