Monday was the first win of the season for Keselowski and his first in the Coca-Cola 600. It is the 31st win of his NASCAR Cup Series career.
Johnson finished second, which is his best result since winning at Dover in June 2017. Johnson had also stayed out under the final caution.
Elliott fought back to finish third after restarting 11th. Ryan Blaney finished fourth on older tires while Kyle Busch finished fifth. Busch was the first car off pit road with fresh tires and restarted ninth.
Elliott had powered to the front with 38 laps to go. He took the lead from Keselowski, who had grabbed the top spot off a restart with 47 laps to go. Just days after leaving Darlington Raceway furious after being spun from second inside the final 30 laps, it appeared Elliott was going to rebound before the caution flew with two laps to go, and crew chief Alan Gustafson called him to pit road.