Cresciuto nel settore giovanile del Milan, ha esordito in prima squadra il 24 agosto 2017, a 17 anni, entrando nel secondo tempo della partita del terzo turno preliminare di Europa League vinta per 1-0 sul campo dello Škendija.[7] Questa rimane la sua unica presenza stagionale con la prima squadra, con la quale rimane aggregato pur continuando a giocare con la Primavera.
Il 31 agosto 2018 viene ceduto in prestito alla Lucchese, militante in Serie C.[8] Il successivo 27 settembre segna la prima rete in carriera, nel pareggio casalingo ottenuto contro la Carrarese.[9][10] Gioca titolare e ottiene 29 presenze in campionato con la squadra toscana.
Ritorno al Milan
Nella stagione 2019-2020 fa ritorno al Milan. L'esordio stagionale avviene il 15 gennaio 2020 negli ottavi di Coppa Italia contro la SPAL (3-0), entrando ad otto minuti dal termine al posto di Simon Kjær.[11] Esordisce in Serie A il seguente 17 febbraio, in occasione della sfida vinta 1-0 in casa contro il Torino, subentrando all'infortunato Kjær al 44'.[12] Nella successiva partita, pareggiata 1-1 contro la Fiorentina, parte per la prima volta da titolare venendo rimpiazzato al 74' da Mateo Musacchio.[13] Il 28 febbraio rinnova il suo contratto coi rossoneri sino al 2024.[14] Complici gli infortuni di diversi suoi compagni di reparto, trova spazio nel girone di ritorno e termina la stagione con 9 presenze in campionato.
Trova discreto spazio anche all'inizio della stagione 2020-2021, prima di fermarsi a dicembre a causa di una lesione al ginocchio sinistro.[15]
Nella stagione 2021-2022 ottiene 8 presenze in Serie A e contribuisce, da comprimario, alla vittoria del campionato.
Il 25 ottobre 2022 segna il suo primo gol assoluto sia con la maglia rossonera sia in UEFA Champions League aprendo le marcature nel successo per 4-0 in casa della Dinamo Zagabria.[16]
Prestito al Villarreal e secondo ritorno al Milan
Il 26 luglio 2023 Gabbia si trasferisce in prestito al Villarreal, nella massima serie spagnola.[17][18] Debutta con la squadra della Comunità Valenciana il 18 agosto seguente, nella vittoria esterna per 1-0 in casa del Maiorca. Il 3 gennaio 2024, dopo aver collezionato 13 presenze tra campionato e coppe,[19] il suo prestito al club spagnolo viene interrotto anticipatamente e Gabbia fa ritorno al Milan.[20]
Il 3 febbraio 2024 segna il suo primo gol in Serie A contro il Frosinone, firmando il momentaneo 2-2 nella partita terminata poi 3-2 per i rossoneri.[21]
Il 18 aprile va a segno anche in Europa League, nella gara di ritorno dei quarti di finale persa per 2-1 in casa della Roma.[22] Il 22 settembre segna il gol decisivo per la vittoria per 2-1 nel derby della Madonnina contro l'Inter.[23]
Il 28 novembre 2024 rinnova il suo contratto con il Milan fino al 2029.
Esordisce con la nazionale Under-21 il 6 settembre 2019, nella partita amichevole contro la Moldavia vinta per 4-0 a Catania.[26] Il 12 novembre 2020 è capitano nella vittoria esterna per 2-1 contro l'Islanda; indossa la fascia anche contro i pari età del Lussemburgo, nella partita vinta per 4-0. Nel marzo del 2021 prende parte alla fase a gruppi del campionato europeo Under-21[27] e chiude l'esperienza con gli azzurrini con 7 presenze.