The Red Sox had lost the first two of a four-game series after sweeping the majors' best team, Tampa Bay, earlier this week.
The loss snapped the Royals' three-game winning streak.
Mike Lowell drove in Boston's lone run with an RBI grounder.
Dustin Pedroia's sliding backhanded stab of David DeJesus' grounder saved a run in the eighth inning.
Buchholz (7-3) allowed four hits - three singles - walked four and struck out four in posting his sixth win in seven starts. He's 3-0 with a 1.32 ERA in his last three outings.
Greinke (1-6) was coming off his worst start in nearly two years, when he was pounded for eight runs - seven earned - in 3 1-3 innings last Sunday against Colorado. He gave up the one run and five hits, walked three and struck out three in six innings.
Boston reliever Daniel Bard stranded a runner at third in the eighth - with Pedroia's play the key - and Jonathan Papelbon worked a perfect ninth for his 12th save.
The Red Sox grabbed a 1-0 lead in the second when Adrian Beltre singled leading off, advanced to third on J.D. Drew's double off the left-field wall and scored on Lowell's bouncer to second.
Jason Kendall doubled leading off the eighth against Bard and advanced on a sacrifice. After Mike Aviles fanned on a slider outside the strike zone, Pedroia made his play on a sharply hit ball to his right when he slid to one knee, got up and fired to first.
Buchholz allowed only one baserunner to third, coming in the fourth when Aviles advanced from second on Billy Butler's double-play grounder. The right-hander then retired Jose Guillen on a grounder to first.
Greinke worked out of jams in the third and fifth. After the initial two batters reached in the third, he sandwiched strikeouts of David Ortiz and Beltre around Victor Martinez's fly out.
In the fifth, Boston loaded the bases with two outs on a double by Ortiz, intentional walk to Martinez and walk to Beltre, but Drew bounced to first.
This program aired on May 30, 2010. The audio for this program is not available.