Federer, an eight-time victor of his hometown event, was far from his best but managed to come back from a break down to win the first set in a tiebreaker on Friday.
A ninth title at Federer's hometown event in Basel, where he was once a ball boy, matched the nine he has won at the Halle grass-court event in Germany.
The 37-year-old was unable to control his emotions after the straight-set win over qualifier Marius Copil in the final of the ATP 500 tournament.
World number three Federer fought back to 5-5, then saved a set point in the 12th game before winning 7-1 in the tiebreak.
The Swiss crowd favourite was never able to comfortably take command against an opponent whom he had defeated in their last six meetings.
"I still can't believe I won, it's been an unbelievable week for me", Copil said.
Copil will be competing in the biggest match of his career after overcoming second seed Zverev, with the Romanian having dropped just one set this week.
"I played quite good tennis, it was an wonderful week", he said.
It's the second final of the year for Copil.
"It would be great to win my 99th career title here in Basel".
The 20-time Grand Slam champion will have to re-group quickly for the semis, where he will play the victor from Greek breakthrough player Stefanos Tsitsipas and Daniil Medvedev.
There were five breaks of serve in the second set with three of those claimed by Simon as the Frenchman rallied to even out the scoreboard.
Just as Federer looked to be settling into form after almost 30 unforced errors in the opening set, more disruption ensued.
But Federer lost his edge once again after Simon broke en route to squaring the decider at 4-4.
The top seed grabbed a second break, with the Swiss serving out victory a game later on his first match point.
Federer put the pressure on Simon's serve after battling back from 15-40 down in the 10th game and Simon crumbled with two straight errors.