The Swiss needs to win the title on Sunday – it would be his tenth at the event – to remain world number one heading into Wimbledon.
He will face either Spanish fourth seed Roberto Bautista Agut or Croatian Borna Coric.
Federer’s win was his 20th in a row on grass, dating to June, 2017.
Federer needed just under 90 minutes to get the job done and hold off the 109th-ranked Kulda, who had not lost a set going into the semi-final.
Federer is back in a familiar spot in Halle, which models its Centre court after its namesake at the All England club, as he works to fine-tune with a Wimbledon title defence starting a week from Monday.
The 36-year-old has reached the final four in each of his last 14 Halle appearances.
Taming Kulda was no easy task, with Federer losing a break after taking an early 2-0 lead.
The first set went into a tiebreaker where the 20-time Grand Slam winner was able to step his game up a gear, racing to 6-0 in the decider and taking it two points later with his seventh ace.
The top-seeded Swiss kept the pressure on Kudla in the second, with the qualifier saving break points before Federer salvaged three of his own to square the set at four games apiece, sealing his effort with an ace, one of his dozen in the match
Federer gained the crucial service break for a 6-5 lead as Kudla returned long, and the Swiss closed out the victory a game later on the first of two match points.
Federer skipped the clay campaign to concentrate on the grass, and after consecutive tournaments on the lawns – he won the Stuttgart title last week – plans a light week of training and rest in London ahead of Wimbledon.