Schema changes go wrong when they're improvised, someone edits a table in production, forgets which environment it ran on, and the next deploy collides with reality. Versioned migrations exist to end that.
The discipline is three rules: every change is a numbered file, every file has a rollback, and every migration runs against a copy of production data before it touches the real thing. The third rule is the one teams skip, and the one that catches the disasters.
For small systems, the tooling is simple: your framework's migration runner, a nightly dump to test against, and a habit of writing the down-migration while the change is fresh. Migrations stop being scary when they're routine.