если лейбл станет родительским элементом input, то инпут уже никак не сможет влиять на стили label, соответственно будет невозможно для лейбла узнать, что инпут стал чекед (без JS)
поэтому нужно разделить лейбл и тот элемент, который стилизуется под чекбокс (его сделать через span)
это понятно, но смысл в том, что чекбокс нельзя стилизовать. По этой причине нужен еще один тег, который будет идти после input и выступать в роли тега, который будет стилизоваться под чекбокс