The Royals won their sixth straight and handed the White Sox their sixth consecutive loss.
Kansas City let a 6-3 lead get away in the late going, but avoided extra innings by producing a run against Matt Thornton (1-5).
Gordon opened the ninth with a single and moved to second on a sacrifice by Melky Cabrera. After Billy Butler was intentionally walked, Hosmer hit an 0-1 pitch to left for the game-winning hit.
Hosmer also scored a run that gave Kansas City a 3-2 lead in the fifth. He came in on a single by Jeff Francoeur and Mike Moustakes followed with a two-run homer.
Chicago eventually rallied into a 6-6 tie in the eighth on Brent Morel's two-run homer.
Kansas City's ninth-inning run made a winner out of Greg Holland (5-1), who struck out two in a perfect top of the inning.
Boston schools pull out free condoms over wrapping complaints
Ray Liotta sues skin care company over use of likeness