Alcides Escobar also knocked in three runs with a triple and a single.
The sizzling Royals have now won 19 of their last 23 games including 11 of their last 12.
"I knew it was going to be a little strange playing against your former team, but it is what it is," Willingham said. "I was just happy to help us win a game tonight."
Willingham, traded by the Twins to the Royals on Monday, came up with the bases loaded and none out in the fourth inning against right-hander Ricky Nolasco.
Maybe going to bat against a former teammate would be a help.
"I don't think so, we have scouting reports on all the pitchers that we face," Willingham said. "So it was just one of those things where I knew he was going to try to be aggressive in the strike zone and I was going to try to be aggressive. And I just happened to put a good swing on it and hit it hard."
First pitch and, bam, Willingham sent a rocket into the left-field corner to score all three runners and wipe out the Twins' 2-0 lead.
"Always as a hitter, you want to hit with runners on base and I knew that was a big spot for us, and I was just happy to come through," he said.
Salvador Perez had opened the inning with a double to left, Billy Butler singled sharply to right and Alex Gordon was hit by a pitch. After Willingham cleared the bases, Mike Moustakas got an infield single and both of them scored as Escobar lined a triple into the right-center gap.
"I thought I made some good pitches," Nolasco said. "It was just a little unfortunate the balls found holes. The main one was the one to Willingham. I'd like to have that one back. It was a fat pitch and I hung it. That's what good hitters do. They make you pay in RBI situations."
Nolasco then got three outs, but the Royals were up 5-2.
"Big night for Josh. That was a huge double to get us back in the lead," manager Ned Yost said. "Big night for Esky with three RBIs. Good night offensively for us."
Royals left-hander Danny Duffy yielded two runs in the third inning, largely because of his own wild throw. Eduardo Escobar and Jordan Schafer each singled, and Danny Santana dropped a nice bunt in front of the plate. Duffy grabbed the ball, but his eager throw was over Butler's head at first base and sailed away for a run-scoring error.
Schafer scored the second run as Brian Dozier grounded out.
Duffy gave up another run in the fourth inning when Trevor Plouffe doubled, took third on Kurt Suzuki's single and survived a pickoff throw by Perez and the subsequent instant replay challenge. Plouffe trotted home as Oswaldo Arcia grounded into a double play.
After one out and Kennys Vargas' single in the sixth, Duffy was relieved by right-hander Aaron Crow.
"I totally know why," Duffy said of Yost's move. "He's trying to save our arms and we had a fresh 'pen, and the 'pen's been outstanding all year. I had no problem with it. Did I want to stay in? Yeah, but you've got to look at the big picture and Skip made the right move."
Crow got an out, but Suzuki's single had Yost calling left-hander Francisley Bueno from the bullpen and he got Arcia for the third out.
Kelvin Herrera worked a 1-2-3 seventh inning and the Royals picked up an insurance run in the eighth. Gordon and Moustakas each singled and Escobar floated an RBI single to right against lefty Brian Duensing. That made the score 6-3 but, in the end, proved to be the winning run.
"I was looking for a fastball and I hit the ball right off the end of the bat," Escobar said. "I was looking for the ball. Where's the ball? It was right behind first base. That was a big hit. I liked that one better than the other one. That was a big run right there."
Wade Davis pitched past a double by Joe Mauer, who extended his hitting streak to 16 games, for a scoreless eighth. That extended Davis' string of scoreless innings to 19 2/3 innings.
Closer Greg Holland's ninth started with a walk to Suzuki, who scored as Arcia belted a double off the right-center wall and took third on Lorenzo Cain's throwing error. Holland got Escobar on a fly ball to left and pinch-hitter Chris Parmelee on a groundout to first that scored Arcia, slicing the margin to one run.
Then, Holland struck out Santana to notch his 37th save.