For number 1 I realized that renaming a symbol changes the VALUE field. So I decided to see how that is implemented. And while looking I found that also saving a copy of a symbol (saveSymbolCopyAs) changes the VALUE field if it was previously the same as the name of the symbol. This is not my favorite way to do it but I think given it works that way I think that deriving a symbol should work the same way.
wxString symbolName = old_lib_id.GetLibItemName();
[..]
bool valueFollowsName = symbol->GetValueField().GetText() == symbolName;
[..]
if( valueFollowsName )
new_symbol.GetValueField().SetText( symbolName );
Similar code is in void SYMBOL_EDIT_FRAME::UpdateAfterSymbolProperties( wxString* aOldName ) which I believe is what is used when renaming symbol.
So I think that pretty much nails down what 1. should do.
I have no updates on 2 or 3.