The 33-year-old Penn seemed close to folding in the second round as the blows to the body took their toll. But the undersized Hawaiian showed a huge heart and finished the fight.
MacDonald, a decade younger, was bigger and more powerful. Penn gave it his all and never stopped coming forward, but always at a cost. His lumpy, swollen face told the story and he was taken to hospital after the fight to be checked out.
There was a fractious leadup to the contest but the two shook hands briefly as the bout ended. The judges scored it 30-26, 30-26, 30-27 for the Montreal-based fighter, who established his credentials as a 170-pound contender if not a fan favourite.
"A huge role model for me ... He's a hero for me," MacDonald, who was booed during his post-fight interview, said of Penn.
But all that respect goes out the window when he steps into the cage, the young Canadian added.
MacDonald (14-1) ran his winning streak to four in a supporting fight that had a main event feel to it. Penn (16-9-2) has now gone 1-4-1 since the start of 2010.
In the main event of a highly entertaining televised card at KeyArena, lightweight champion Benson (Smooth) Henderson dominated Nate Diaz in a lopsided 50-43, 50-45, 50-45 decision.
It was a mature, impressive performance by the 155-pound champion, who has struggled to win respect since beating Frankie (The Answer) Edgar in two close title fights earlier this year. Henderson showed all the weapons in his arsenal, and then some. In the third round, he essentially did the splits to evade a submission attempt.
In addition to a takedown and scything kick, Henderson used his grappling to control Diaz at the fence in a first round that saw the two get in each other's faces as the bell sounded. Diaz's face was already showing damage and it got worse with a short elbow in the second.
Diaz raised his arm after the third round, but it was all Henderson at that point. Diaz, a good striker with a black belt in Brazilian jiu-jitsu, was never allowed to get his game going.
Perhaps surprisingly, Henderson did more damage with his fists — with his four-foot-nine mother Song Henderson loudly cheering him on from the front row.
Diaz swaggered his way to the cage, with older brother Nick in his trail. Nick Diaz is expected to fight champion Georges St-Pierre in 2013.
Henderson, who grew up in the Seattle area but now fights out of Phoenix, followed to loud cheers. The two did not touch gloves before the fight, but shook hands after.
In the co-main event, rising Swedish star Alexander (The Mauler) Gustafsson dominated former light-heavyweight champion Mauricio (Shogun) Rua to earn a shot against either current title-holder Jon (Bones) Jones or Chael Sonnen — who meet in April.
"I want the belt. I want to fight whoever has it," said Gustafsson.
Like Penn, Rua showed courage in coming forward and absorbing a beating at the hands of a younger, bigger man.
The judges scored it 30-27, 30-27, 30-26 for Gustafsson.
The six-foot-five Swede used his speed and size to keep the Brazilian at bay and Rua (21-7) was spitting blood and sporting a welt on his chest from a knee after an action-packed first round.
The 31-year-old Rua, who has a lot of miles on his chassis, tried but had no answers for the 25-year-old Gustafsson. When he came forward, it was like charging a combine harvester and his face showed it.
Gustafsson (15-1) has won six straight and is 7-1 in the UFC. He returns home to Sweden, where he will tattoo another shark's tooth on his arm to mark the win.
The MacDonald-Penn fight, while third on the billing, arguably stole the pre-fight show with an icy MacDonald saying he was going to hurt Penn, an MMA icon with a devoted following.
Penn, a former lightweight and welterweight champion, retired in the cage in October 2011 after a lopsided loss to Diaz. Tired of the couch, he texted UFC president Dana White and said he wanted to return against MacDonald.
The intense, young Canadian accepted the challenge and was stone-faced leading up to the fight, saying Penn had returned for the wrong reasons — looking to cement his legacy — and was going to get hurt. It made for a frosty buildup, with many fearing Penn had bitten off more than he could chew.
MacDonald was booed as he was shown entering the arena on the big screen. Penn's entrance earned cheers.
MacDonald got a slightly better reception as he walked to the cage, with Canadian flags flying in some parts of the arena. But that turned into a chorus of boos and then a wave of cheers as Penn walked out to his traditional Hawaiian music.
Penn came out aggressively looking for a takedown. But the bigger MacDonald fought him off with kicks and a body shot. Both men scored on their feet but MacDonald took control in the last minute, wobbling him with an nasty elbow to the head.
There were more chants of "B.J., B.J." in the second round, but MacDonald took it to Penn with combinations at the fence. Chants of "Rory, Rory" followed. Then Penn found his range, connecting with strikes.
After the barrage of body blows, MacDonald took Penn down late in the round.
The doctor looked at Penn, who had a large mouse under his right eye, before the third but the fight continued. MacDonald repeatedly pinned Penn at the fence and then, when they separated, punched away.
MacDonald was booed for an Ali shuffle late in the fight.
MacDonald was cornered by friend and fellow Montreal-based fighter Mike Ricci, who goes up against Colton Smith next Saturday in Las Vegas in the live finale of Season 16 of "The Ultimate Fighter."
They both train alongside St-Pierre, who has beaten Penn twice.
MacDonald and GSP have said they will not fight each other because of their bond at Montreal's Tristar Gym.
After the fight, MacDonald asked for a rematch with Carlos (Natural Born Killer) Condit — who handed him his only UFC loss.
It was a successful venture for the UFC — the card was sold out with 14,412 in attendance, earning a gate of US$1.5 million.
More than a few fighters were put to sleep in Seattle this night.
It was a night of big finishes, with officials resorting to power sprayers to clean the bloody canvas after the preliminary fights.
Welterweight Matt (The Immortal) Brown knocked out Mike (Quick) Swick with a left-right combination that send a limp Swick flying backwards. The fight was called at 2:31 of the second round, after a first round dominated by grappling.
For the hard-nosed Brown (18-11), it was a fourth straight win — and another step forward in a life that has survived a heroin overdose. For Swick (15-5), it was a loss to go with a victory four months ago that followed a 910-day layoff due to a digestive disorder and knee injury.
Lightweight Jeremy (Lil' Heathen) Stephens, arrested just hours before his last fight, was knocked out by Yves Edwards.
The 36-year-old Edwards (42-18-1) floored Stephens (20-9) with a right to the chin and then finished him off with elbows on the ground at one minute 55 seconds of the first round.
The next date circled on Stephens' calendar is Dec. 13 for a pre-trial conference in Iowa on charges of wilful injury causing serious injury, burglary in the first degree and assault causing bodily injury.
He was taken into custody on an outstanding warrant on the day of his last scheduled fight, also against Edwards, in Minneapolis on Oct. 5 and spent 12 days behind bars before being bailed out. The 26-year-old Stephens, who received a warm welcome from the Seattle crowd, maintains his innocence.
Edwards got $65,000 for knockout of the night on Saturday.
Germany's Dennis Siver (21-8) put on a show in his second outing at featherweight, dominating Nam Phan and showing off a complete arsenal en route to a 30-24, 30-25, 30-26 decision.
Silver, whose day job is BMW mechanic, was on fire in the first round, lashing Phan (18-12) with kicks and punches. He bloodied Phan up on the floor in the second and third round to improve his UFC record to 10-5.
Lightweight Daron (Detroit Superstar) Cruickshank felled Henry (Sicario) Martinez with a highlight-reel head kick at 2:57 at of the second round. Martinez crumpled while Cruickshank (12-2) stood in place, throwing his arms up in victory before doing a backflip.
A bloody Martinez had to be led back to his corner after a first round that saw him survive a prolonged pummelling at the fence after eating a kick to the body and then, later in the round, a kick to the head.
Whatever Martinez (9-3) was paid for the fight wasn't enough, considering the punishment he took. Especially since he forfeited 20 per cent of his purse to Cruickshank after failing to make the 156-pound limit Friday.
Bantamweight Scott (Young Guns) Jorgensen (14-6) choked out John (Prince) Albert (7-4) with one second left in the first round after a back-and-forth entertaining scrap that saw both men show off their ground game.
Jorgensen and Albert won $65,000 each as a fight of the night bonus. Jorgensen won another 65k for submission of the night.
UFC newcomer Abel (Killa) Trujillo (10-4) stopped lightweight Marcus (The Prospect) LeVesseur by TKO at 3:56 of the second round with a string of nasty knees to the body of his turtled opponent.
LeVesseur (22-7) only found out Friday he was back on the card. His fight was pulled five days ago when opponent Michael Chiesa fell ill but was summoned back when Trujillo's opponent — Tim (The Dirty Bird) Means — fell in the sauna and hit his head.
Lightweight Ramsey Nijem (8-2) ended Joe Proctor's four-fight win streak with a 30-27, 29-28, 29-28 decision that saw Proctor (8-2) survive a front kick that put him down in the first round.
Brazilian bantamweight Raphael Assuncao (18-4) handed Mike (The Hulk) Easton (13-2) his first loss in the UFC after three wins, earning a 29-28, 30-27, 30-27 decision despite breaking the radius bone in his arm in the first round.