HTML semantico risolve la maggior parte dei casi: usa <button> non <div onClick>, usa <nav> non <div class='nav'>, usa <label> associata all'input non placeholder come sostituto.
Quando ARIA serve davvero: componenti custom che non hanno un equivalente HTML nativo. Un accordion custom, un combobox filtrable, un date picker. In questi casi aria-expanded, aria-controls, aria-haspopup fanno la differenza per gli screen reader.
L'errore più comune: aggiungere role='button' su un <div> invece di usare <button>. Non risolve il problema — un div con role='button' non riceve il focus automaticamente con Tab, non risponde a spazio/invio. HTML semantico è sempre migliore.