The main difference between remember { mutableStateOf() } and having state holder (it can be also mutableStateOf(), or StateFlow, or LiveData), is that who owns state.
Remember is a state holding mechanics, which holds state on level of composable, which is fine, but usually only for UI state which you don’t want to save.
In general there are many advantages to hold it on level of VM, so you do not pollute your UI code with business logic of state handling, validation, saving etc
What to use on level of VM, depends on your taste.
I would not recommend using LiveData at all; it’s not flexible, the API is not great, and if you need anything more complex, you are stuck. I think it is softly deprecated for now.
StateFlow is the most flexible and better integrated with Kotlin solution, but another question, do you need all coroutines features or not, and specifically, do you use reactive features (mapping multiple streams, running in another thread etc)
If not, and State/MutableState from compose is good alternative, but very simple, essentially just a way to expose observable state for compose code, not usable for other cases
If you want to preserve state on Activity destroy, you have to use saved instance state integration, you can do it both from VM or from compose code