Duffy (3-5) allowed just one hit and one walk over six innings for the Royals, who were coming off a four-game split in Toronto over the weekend.
Alex Gordon broke a scoreless tie with a solo home run in the seventh, Mike Moustakas added a two-run double and Salvador Perez went 3-for-4 with two runs scored and an RBI for the victors.
Shelby Miller (6-5) came undone in the latter innings and was charged with four runs on seven hits over seven-plus frames for the Cardinals, who were shut out for the second straight day and fell to 2-6 on a nine-game homestand.
These close interleague rivals will play again at Busch Stadium Tuesday, then round out a four-game home-and-home set with two meetings in Kansas City.
There were no extra-base hits from either side Monday before Gordon changed that with a leadoff shot that cleared the bullpen beyond the wall in right in the seventh.
Gordon's fifth home run of the season began a string of four consecutive hits for the Royals, who added two more runs when Moustakas doubled into the gap in left to knock in Perez and Lorenzo Cain.
Duffy was pinch-hit for in the frame, and though the decision to pull him did not immediately pay off, Kansas City blew the game open with three more runs in the eighth.
With two on and one out, Perez singled past a diving Mark Ellis and into center field to plate Omar Infante. Gordon scored on the play when Randal Grichuk misplayed the ball in center, and Lorenzo Cain's sacrifice fly made it a 6-0 game.
Kansas City's Kelvin Herrera, Wade Davis and Aaron Crow each tossed an inning of relief behind Duffy to finish off the shutout.