In practice they are definitely freely used for both. There are a number of mission items (such as do_change_speed) that function quite nicely at any point during autonomous flight and reusing the command and definition is very convenient. Depending upon your internal autopilot structure you may actually be reusing the same command handler for both the mission and command version.
Commands also have the benefit that they have a ACK message. Anytime you want to make a new custom message you need to consider if there should be a corresponding ACK message, since we lack a generic form of ACK'ing. For commands to vehicles (such as change speed, or fly to this location) having an ACK/NACK is essential.
The main reasons that come to mind for stand alone command messages is that the information you want to convey does not fit into a command for some reason (needs more then 7 parameters, or needs different representation then 7 floats or 5 floats 2 int32_t's), or it's part of a larger standalone protocol.