потому что оно переводится в те же ассемблерные команды условного перехода (jz/jnz и т.п.).
Если значения меток идут подряд - вменяемый компилятор с включенной оптимизацией вставляет табличный переход. Если часть идет не подряд - сначала вставляются jz/jnz на эти "не подряд", а в конце - табличный переход для оставшихся "подряд". Хороший оптимизатор может то же самое сделать и из кучи if-else, так что выбор остается за программистом - какой из вариантов записи лучше отражает задумку автора в конкретном месте программы. У меня, например, кое-где для лучшей читаемости используется switch с одной-единственной меткой case.