Forms are how a web page asks for something back: a search query, a login, a shipping address, a file. Before JavaScript existed, <form> was the only way to send data to a server, and it still needs no script: the browser collects the named controls, validates them, encodes the values and sends an HTTP request to the URL in action. Frameworks have returned to this model: in React 19 7,897 , <form action={fn}> passes a FormData object to your function, and a server-rendered form keeps working before its JavaScript has loaded.
Native controls also come with things that are expensive to rebuild: keyboard support, screen reader semantics, mobile keyboards tuned to the data type, date and color pickers, autofill, and validation messages in the user's language. Reach for a custom widget only when a native control cannot do the job, and check Customizable <select> first.

Two old claims about forms need correcting. POST is not "secure": it only moves the values from the URL into the request body, readable by anyone on the network unless the page uses HTTPS. And form.submit() is not the same as pressing a submit button: it skips steps 2 and 3, so modern code calls form.requestSubmit() (Validation and Autofill).