Is there a standard way to control which node or entity links appear in which view modes? My module adds a link to the node view, from within hook_node_view. Is there a "Drupal" way to let the site builder control which view modes should show that link?

Right now, I'm using a multiselect control on the module's admin settings page.
If you are adding fields in hook_node_view then the most polite thing you can do is add them to the 'manage display' tabs for that content type. Do this using hook_field_extra_fields(). This way people can: hide or show them per content type, per view mode and also position them amongst other fields, just like any field API field.

Here is a code example where I have added the print links to the node using hook_node_view().

/**
 * Implements hook_node_view().
 */
function zest_general_node_view($node, $view_mode, $langcode) {

    // Add print and email links as pseudo field.
    $node-&gt;content['print_links'] = array(
      '#markup'=&gt; print_insert_link() . print_mail_insert_link(),
      '#view_mode' =&gt; $view_mode,
      '#prefix' =&gt; '&lt;div class="links inline print-mail"&gt;',
      '#suffix' =&gt; '&lt;/div&gt;',
      '#weight' =&gt; 20,
    );

}


Then I add them as a 'pseudo field' using hook_field_extra_fields().

/**
 * Implements hook_field_extra_fields().
 *
 * Adds the print and email links as a pseudo field.
 */
function zest_general_field_extra_fields() {
  $extra = array();

  $extra['node']['product'] = array(
    'display' =&gt; array(
      'print_links' =&gt; array(
        'label' =&gt; t('Print Links'),
        'description' =&gt; t('Links provided by the print module.'),
        'weight' =&gt; 20,
      ),
    ),
  );

  return $extra;
}


hook_field_extra_fields()