With Pune needing 11 runs, Johnson conceded a four off his first ball but then removed Manoj Tiwary and Steve Smith with consecutive deliveries.
Captain Smith hit 51 to give Pune a chance after their chase had faltered.
But Johnson's 3-26 and Jasprit Bumrah's 2-26 helped Mumbai defend 129 to become the first side to win three IPL titles.
Mumbai's previous victories came in 2013 and 2015.
After electing to bat first in Hyderabad, Mumbai fell to 8-2 and then 79-7, before Krunal Pandya's 47 off 38 balls, supported by late-order hitting from Johnson (13 off 14) saw them post 129-8.
In reply, Ajinkya Rahane struck 44 off 38 balls before he was removed by Johnson to leave Pune on 71-2 after 12 overs.
They added just 29 runs in the next five overs thanks to expert bowling from Lasith Malinga and Bumrah, who had former India captain MS Dhoni caught behind for 10.
A straight six from Australia captain Smith off Bumrah's penultimate delivery in the 19th over seemed to steer the match back Pune's way, only for Johnson to hold his nerve as Dan Christian was run out attempting a desperate third run off the final ball.
Mumbai's total was the lowest score successfully defended in this year's tournament.
England wicketkeeper-batsman Jos Buttler scored 272 runs in the tournament for Mumbai, while all-rounder Ben Stokes starred for Pune with a maiden Twenty20 century and 12 wickets, but neither was playing in the final after being recalled for the upcoming one-day international series against South Africa.
A superb final over from Mitchell Johnson saw Mumbai Indians beat Rising Pune Supergiant by one run to win a thrilling Indian Premier League final.