Mahle (5-6) allowed only one runner to touch second base in 6 1/3 innings, matching his career longest start. He is 2-0 in June, allowing two earned runs and 14 hits in 16 1/3 innings.
The Royals have lost nine of 10 and have dropped 23 of 33 home games. They have scored 11 runs in their last eight games and 23 in 12 June games.
Kansas City is hitting .147 this month with runners in scoring position, including 1 for 25 in the past six games.
Duvall greeted rookie reliever Jason Adam with his second grand slam in two weeks, driving a 2-2 pitch over the left-center wall.
Royals starter Jason Hammel (2-7) allowed three runs on seven hits over 7 1/3 innings.
Alex Gordon, a five-time American League Gold Glove winner, made two defensive gems in the sixth inning. Curt Casali singled off the left-field bullpen fence and tried to stretch it into a double. Gordon threw him out from the warning track for his fifth outfield assist this season and the 85th of his career.
Two pitches later, Gordon made a diving head-first catch of Billy Hamilton's liner to rob him of a hit.
Salvador Perez and Hunter Dozier grounded into double plays to end the first two Royals innings.
Mahle retired 12 of the next 13 batters he faced after Gordon walked in the second inning.
The Royals did not have a runner touch second base until Whit Merrifield doubled with two out in the sixth. Mike Moustakas flied out to center to end the inning.
Scooter Gennett had two singles, extending his hitting streak to 10 games. ... Jose Peraza has reached base in 15 consecutive games. ... Reliever Jared Hughes, who pitched a scoreless inning, has not allowed a run in 15 straight appearances.
Royals: 1B Lucas Duda (right foot plantar fasciitis) is doing on-the-field activity. Manager Ned Yost said he is hopeful Duda will go out on a minor league rehab assignment this weekend.
Reds: They are off Thursday before RHP Matt Harvey will start Friday in Pittsburgh.
Royals: After an off-day Thursday, the Royals will open a three-game home series Friday with the Houston Astros. RHP Jakob Junis will be the KC starter for the opener.
Copyright 2018 The Associated Press. All rights reserved. This material may not be published, broadcast, rewritten or redistributed.