Adalberto Mondesi had an RBI single in the sixth and Edward Olivares and Nicky Lopez drove in runs in the ninth, giving the Royals their second straight victory after starting September with seven losses.
Duffy (3-3) struck out four and walked four over 5 2/3 innings to win for the first time at Cleveland in eight starts since Sept. 22, 2014. The left-hander was 0-6 at Progressive Field during that span.
"That's a really good team over there, top to bottom," said Duffy, who is 4-12 with a 5.11 ERA in his career against the Indians. "You have to respect that lineup, and I have a lot of respect for that team and the way they play the game."
"I know those are some arms that the league is not looking forward to facing," Royals manager Mike Matheny said. "(Holland) continues to make really good pitches and his stuff just keeps impressing me. He's in a really good place."
"I think we were trying too hard to put the ball into play in that situation," acting Cleveland manager Sandy Alomar Jr. said.
Mondesi broke the ice against Carlos Carrasco (2-4), driving in Cam Gallagher with no outs in the sixth. Kansas City scored twice off Phil Maton in the ninth when Olivares' bad-hop triple plated Alex Gordon, and Olivares then came around on Lopez's single.
Carrasco gave up seven hits in a season-high seven innings while wearing No. 21 as part of the MLB-wide celebration of Roberto Clemente Day. He won the 2019 Roberto Clemente Award for his numerous community endeavors.
The right-hander had six strikeouts, moving into fourth place in Indians history with 1,281. He surpassed Hall of Famers Bob Lemon and Early Wynn, who both had 1,277.
"It was an honor to wear No. 21 today for a lot of reasons," Carrasco said. "Roberto Clemente was great, on and off the field."
Delino DeShields went 3 for 4 with a triple for Cleveland, which fell one game behind the first-place White Sox in the AL Central.
Lopez singled three times and Kansas City teammates Whit Merrifield and Olivares had two hits apiece. Olivares has a six-game hitting streak and is batting .385 since joining the Royals in a trade with San Diego.
Indians manager Terry Francona, who briefly visited the ballpark Tuesday, missed his 29th game because of season-long gastrointestinal issues that required surgery.
"I know he's feeling better, but I'm not sure how much better," Alomar said.
Kansas City's Bubba Starling made the defensive play of the night in the dugout. Mondesi lost control of his bat while swinging at a pitch in the first, sending it airborne. The bat struck the netting on top of the first-base dugout, and Starling made a one-hand grab to prevent it from striking any teammates.
Alomar, Lindor, C Roberto Perez and assistant hitting coach Victor Rodriguez -- all natives of Puerto Rico -- joined Carrasco in wearing No. 21, along with LHP Brad Hand, the Indians' 2020 Roberto Clemente Award nominee. Kansas City did not have any active players participate.
Royals: C Salvador Perez (left eye), who has been on the 10-day injured list since Aug. 21, took batting practice Monday at the alternate training site. Perez has been affected by blurry vision.
Indians: 3B Jose Ramirez (left hand bruise) batted second and went 0 for 2 after sitting out Tuesday. Alomar said Ramirez feels no pain when he bats right-handed, but is unable to switch-hit until the swelling subsides.
Royals: RHP Brady Singer (1-4, 5.58 ERA) has not won in five road starts this season despite holding opponents to a .232 average. He is 0-2 with 24 strikeouts in 25 2/3 innings away from Kansas City.
Indians: RHP Aaron Civale (3-4, 3.72 ERA) is tied with teammate Shane Bieber and Texas' Lance Lynn for first in the majors with eight starts of at least six innings. Civale's last home victory was on July 28.
More AP MLB: https://apnews.com/MLB and https://twitter.com/AP-Sports
Washington Nationals re-signing Josh Harrison to one-year contract
Landing in Washington as the 2020 regular season began, utility player Josh Harrison did enough to re-sign with the Nationals on a one-year contract for $1 million.
World Series 2020: 'Travel day' roundtable -- everything we learned in Games 1 and 2
The series is staying in Arlington, but the Dodgers and Rays have 24 hours to catch their breath. We answer the biggest questions so far in this Fall Classic.
The 10 greatest performers in World Series history
With the Dodgers back in the World Series, we recall the most legendary Fall Classic figures -- including both a Hollywood hero and an L.A. nemesis.
World Series 2020: How Brandon Lowe got his swing straightened out at exactly the right time
Tampa Bay's best hitter has been a mess most of the postseason, but getting in touch with his personal hitting coach changed everything.
World Series 2020: Inside Los Angeles Dodgers' failures in Game 2's big at-bats
As great as the Dodgers are, they won't end their title drought if they come up empty in high-leverage moments the way they did in Wednesday's loss to the Rays.
SportsCenter Top 10: October 21
The best plays from the world of sport on October 21.