I think different workflows are getting mixed up here.
For hobbyists, individuals and “occasional users” and for simulations it’s the easy way of being able to just change a value of a part.
When companies get bigger, have multiple full time developers, and employees who’se full time job it is to maintain libraries or keep parts stock up to date (those can be different persons) then workflows change, and having fully defined parts becomes an advantage.
Such companies may have a database with hundreds of resistors, in different sizes, and tolerances. Special flame retardant or fusable resistors etc. And this is where “database libraries” are being used. Such libraries are also coupled with inventory management and the supply chain.
Such libraries may also have integrated in them groups of compatible replacement parts for “generic resistors” or a resistor can be locked to a special type, to ensure the right resistor is being used in production.
Just imagine what can happen in a big factory when for example a special flame retardant resistor is accidentally replaced by a generic resistor and it slips though quality control and tens of thousands of products get shipped before it is detected.
And something like this is not typically how it happens:
I have no experience with such systems myself, but I would guess that you could just select a resistor with the mouse and then replace it with another one from the database.
But KiCad is not there yet. Some progress is being made, and there is now some preliminary support for database libraries in KiCad, but I don’t know much about that area. As a hobbyist I’m quite happy with just changing a string to change a value of a resistor.