How do I override menu items with my own implementation? My specific use case is this: I don't want users accessing the user/%user/edit menu. This is awkward because it's quite embedded in Drupal, e.g. forgotten password system. I want the drupal form for admins, but I want a different form for end-users because I do not want to expose certain user fields to them, and because some updates they may need to do need to be handled by an external database, so changing them in Drupal is unhelpful.

Using hook_form_alter() is not really going to cut it; it really does need to be quite a different form.

I had planned to override the user/%user/edit path by using my own module. This would then check if the accessing user was an admin, and if so, present the stock form, but if not it would drupal_goto('client/updates'); but this doesn't work; my module's page callback never gets called.
You can use hook_menu_alter() to reroute the request for that page to your own module's functions:

function MYMODULE_menu_alter(&amp;$items) {
  $items['user/%user/edit']['access callback'] = 'MYMODULE_access_callback';
  $items['user/%user/edit']['page callback'] = 'MYMODULE_user_edit_page_callback';
}

function MYMODULE_access_callback($account) {
  if ($something) {
    return FALSE;
  }

  return TRUE;
}

function MYMODULE_user_edit_page_callback($account) {
  if ($something) {
    return drupal_get_form('some_form');
  }
  else {
    return drupal_get_form('some_other_form');
  }
}