The win, the first for the Royals over Detroit at Kaufmann Stadium this year, prevents a four-game sweep and puts them 6 1/2 games back of the lead in the American League Central. Kansas City (48-46) sits eight games ahead of their 2013 pace.
Bruce Chen allowed two runs on eight hits over the first 5 1/3 innings in place of an injured Jason Vargas. Ventura (7-7) allowed just one hit while striking out three batters in only 1 2/3 innings.
Miguel Cabrera's sacrifice fly and J.D. Martinez routine fly that dropped into shallow left field plated runs in the third, giving the Tigers (53-38) a 2-0 lead.
Justin Verlander (8-8) kept Kansas City off the board until Alcides Escobar began the rally with a run-scoring infield single in the seventh. Verlander was pulled after recording one out in the inning, allowing four runs and six total hits.
Jarrod Dyson grounded into a fielder's choice to tie it 2-2, while Omar Infante plated a pair with a single to put the Royals on top. Eric Hosmer also recorded an RBI.
Salvador Perez and Greg Holland will represent the Royals in their second straight Major League Baseball All-Star Game on Tuesday, while Alex Gordon will not take part due to injury.