Bueno, la verdad es que todas las etiquetas se pueden cerrar perfectamente, pero no estamos obligados a hacerlo, dado que HTML es un lenguaje bastante abierto.
En HTML originariamente existían etiquetas que se colocan en un sitio y ya está. Es decir, las colocamos en un lugar y tienen validez en ese lugar, no hay que cerrarlas más adelante. Ocurre, aparte de <br>, con <img> o <hr>.
Primero hay etiquetas que no requieren cierre porque no tienen como un principio y un fín, es decir, un contenido que tengan que delimitar. Un salto de línea por ejemplo no es que empiece en un momento dado y acabe un tiempo después. Por ello estas etiquetas no se crearon con cierre originalmente.
Pero luego, aunque todas las etiquetas las puedas cerrar en la práctica, los navegadores no lo necesitan, por lo menos en el caso de los saltos de línea <br> o las imágenes con <img> por ejemplo no es necesario, por eso no se suele colocar. Los navegadores lo entienden sin problemas y de hecho son bastante permisivos y tratan de renderizar siempre alguna cosa con el HTML que se les entregue.
Ahora bien, en XHTML, que es una evolución de HTML con una sintaxis menos abierta, todas las etiquetas se tienen que cerrar. Entonces, para las etiquetas que no tienen cierre, se tiene que especificar el cierre en la propia etiqueta de apertura. Por ejemplo:
<br />
<img src=”...” />
Sin embargo, aunque XHTML al final no alcanzase el apoyo necesario para convertirse en una realidad su filosofía, algunas cosas como la posibilidad de especificar el cierre de etiquetas que no lo necesiten ha permanecido soportado por todos los navegadores y actualmente está incluida esta posibilidad de cierre en la propia apertura de la etiqueta.