Superb strikes from Nicolo Barella and Lorenzo Insigne put Italy two goals ahead by the 44th minute, but Belgium pulled one back before the interval courtesy of a Romelu Lukaku penalty.
Lukaku went close in the second period, yet Roberto Mancini's side held firm in the first knockout meeting between the sides at a major tournament.
The Azzurri will now play Spain at Wembley Stadium after Luis Enrique's side overcame Switzerland on penalties earlier in the day.
Italy thought it had opened the scoring in the 13th minute, but Leonardo Bonucci's bundled finish from Insigne's free-kick was ruled out for offside following a VAR review.
Gianluigi Donnarumma denied Kevin De Bruyne and Romelu Lukaku in quick succession midway through the first half, before the Azzurri went ahead in the 31st minute when Barella superbly lashed across Thibaut Courtois for his sixth international goal.
Italy doubled its advantage a minute before half-time when Insigne powered towards the penalty area and whipped into Courtois' top-left corner from 25 yards.
Belgium halved the deficit in first-half stoppage time, however, Lukaku stroking home from the spot after Giovanni Di Lorenzo had pushed Jeremy Doku in the area.
Inter striker Lukaku had a glorious opportunity to draw the Red Devils level on the hour mark, but his close-range effort hit Leonardo Spinazzola with Donnarumma beaten.
Doku blazed over after a mazy run late on as Roberto Martinez’s side, who only had one shot on target in the second half, ultimately saw their Euro 2020 campaign end with a whimper.