A native <input type="checkbox"> gives keyboard support, form submission, and screen-reader semantics for free. Indeterminate is the one state you can't set with an HTML attribute — it needs element.indeterminate = true in JS, and shows as a dash when a parent checkbox's children are only partly checked.
The difference from a radio button is cardinality. A checkbox lets you pick anywhere from none to all of the options; a radio button in a group lets you pick exactly one. If "both is fine" makes sense, use checkboxes; if exactly one must be chosen, use radios.
Always connect the label with <label for="">, so clicking the label text toggles the box too.