in reply to Would you use 'goto' here?

If you want to change the apparent caller, then by all means use goto (since it's to a code ref and not to a label). Though I might do:
goto &edit_office_product if $query->param( 'officeID' );
Though I think I might find it confusing if I'm looking at your error reporting which says 'edit_office_product()' was called from, e.g., foo() and I can't find any reference to edit_office_product in foo() because it was really called from edit_product() (don't know if this is the case from what you said). In which case I might do:
return edit_office_product(@_) if $query->param('officeID');