Expressions will work if you can limit where you want things placed and always do it that way.
In short you specify rules like
if tag is a then move here
else move somewhere else
otherwise yet elsewhere
This way it will be very fast & efficient, of course you would need to import all files in the folder into MC
prior to moving them, otherwise some will be left behind and create a bigger headache. Also this method depends on the files being properly tagged.
Failing that there is always the manual drag from the tree, which will maintain library integrity. If you move files outside MC then you need to set the option 'update for external changes', but i prefer not to depend on this.
As far as a paper trail is concerned i'm not sure how you could record in MC where a file got moved to. There is no record of a before or after location, just current location only. You could implement something like this by creating a custom field and then doing a move/copy field but this would be required for all files and would have to be carried out manually each time you move files.
Part of the reason i don't use the automated move feature is the manual checking required to verify everything went fine afterwards. You don't have to verify but i prefer to
The alternative is manual dragging and as you already know is slower more tedious work, then again there is instant feedback whether a move suceeded or not. This is helpful but its the 'knowing' things ended up in the right place that matters in the end.