Heading into their second leg locked 3-3 on aggregate, Leon punished Morelia 4-0 in Leon de los Aldamas.
Hernan Burbano, Mauro Boselli, Matias Britos and Juan Vazquez scored as Leon, who finished third in the Apertura, eased through.
Leon will face Toluca in the last four after they drew 1-1 at Cruz Azul to complete a 4-1 aggregate victory.
Morelia dominated the opening exchanges at Leon – even hitting the post through Jefferson Montero – but conceded on 28 minutes.
Burbano found space just outside the area and his powerful strike hit the underside of the crossbar before bouncing in.
The hosts struck a second on 57 minutes thanks to Boselli, who was on hand to tap in a corner at the back post after both the defence and goalkeeper Federico Vilar failed to deal with the cross.
Britos put the result beyond doubt with his header before Vazquez added another with a tremendous 35-yard drive into the top corner.
Toluca were untroubled at Cruz Azul despite a 33rd-minute penalty from Christian Gimenez giving the hosts hope.
Pablo Velazquez equalised for Toluca and they had a late chance to win it after Jair Pereira was sent off for Cruz Azul.
Toluca goalkeeper Alfredo Talavera stepped up to take the spot-kick but blazed it well high and well wide.
America, who finished top in the Apertura, battled through to the last four on away goals after a 1-1 draw at home to Tigres UANL.
Raul Jimenez gave America a 52nd-minute lead and they looked to be cruising when the visitors had Hugo Ayala sent off.
But Alan Pulido struck for Tigres, who were unable to find a crucial second goal, on 58 minutes as the tie finished 3-3.
America face Santos Laguna in the semi-finals after the latter were 3-1 winners in their second leg against Queretaro.
Carlos Quintero struck a second-half brace for Santos Laguna, seeing them to a 6-3 aggregate victory.
Get the best features, fun and footballing frolics straight to your inbox every week.
Thank you for signing up to Four Four Two. You will receive a verification email shortly.
There was a problem. Please refresh the page and try again.