Federer, ranked No. 1 in the world, cruised through the opening set to the 15th-ranked Gonzalez, but lost the second and was behind in the third before he rallied to win, 6-1, 5-7, 6-3.
The Swiss, who turned 25 on Tuesday, has a 53-match winning streak in North America since his last loss to Dominik Hrbaty in the first round in Cincinnati on Aug. 3, 2004. He has reached the final in 17 straight tournaments dating back to June 2005, and is one tournament shy of tying Ivan Lendl's ATP Tour record.
In the final, Federer will face 20-year-old Frenchman Richard Gasquet, who beat 19-year-old Brit Andy Murray, 6-2, 7-5, in their first ATP meeting. The win was the 15th for Gasquet in his last 17 matches.