But Butler was needed late on Friday night and he delivered a pinch two-run homer with two outs in the eighth inning to send the Royals over the Cleveland Indians 6-4 for their fourth straight win.
Carlos Santana homered twice for the Indians, who have lost five of six.
Butler connected against John Axford, sending a drive over the Royals bullpen in left field. Butler was hitting just .200 in his previous 20 games with three extra-base hits and two RBIs.
"As of late, the production definitely is not there," said Butler, who entered this season with a career .298 average. "Over my career, it's there, but this game is about what you've done for me lately. If he (manager Ned Yost) thinks a guy matching up differently is better for the team, that's what he's got to do. He's got a job to do putting the lineup out there.
"It's just my job to prove I belong in there. I've been in the league a long time. If you give up and get put in a situation like that, you don't compete. I'm not going to give up."
Butler batted for Raul Ibanez and homered on Axford's second pitch.
"It does give you a shot of confidence," Butler said. "I've got a lot of confidence with a bat in my hand anyway. It definitely helps. Hopefully, I build off that."
Axford gave up the winning hit to Nori Aoki in the 14th inning in a 2-1 loss on Thursday.
"It's obviously tough after the last two nights," Axford said. "It was just a bad pitch. I let it stay out over the plate. It was supposed to be away and it ended up in the seats."
Earlier in the game, the 42-year-old Ibanez drove in a run -- becoming the oldest Royals player to hit a triple. Ibanez scored on the play when second baseman Jason Kipnis made a wild relay throw.
Royals closer Greg Holland, who had pitched in the three previous games, was unavailable.
Perez, who had three hits, and Mike Moustakas had back-to-back home runs to open the second. It was the second time this season Perez and Moustakas hit consecutive homers, having also done it April 23 at Cleveland.
"We like hitting in the hot air," Perez said.
Royals rookie Yordano Ventura, tagged for six runs and nine hits in 4 1/3 innings in his previous start at Boston, left after 6 1/3 innings. He gave up three earned runs and struck out seven.
Santana hit a solo homer in the fourth and a two-run shot in the sixth.
"The first home run to Santana, Ace threw a pretty good pitch, a sinker down and away," Perez said. "The second one was in the middle in and up."
Indians right-hander Josh Tomlin, who was 1-5 in his previous seven starts, was pulled after 5 1/3 innings.
"I thought when he made mistakes with his fastball they made him pay," Indians manager Terry Francona said. "But he always competes every time and keeps you in the game."
RHP Jeremy Guthrie, a first-round pick of the Indians in the 2002 draft, will start Saturday against Cleveland. RHP Zack McAllister will start for the Indians. ... Cleveland RHP Justin Masterson, a 2013 All-Star who is on the disabled list with right knee inflammation, made his second rehab start Friday with Triple-A Columbus. He allowed five runs, four hits and six walks in 6 2/3 innings against Norfolk. . Butler's shot was the 75th pinch-homer in franchise history and the first since Justin Maxwell on Aug. 3, 2013.