Here's another solution using a simple lightweight `db_select` query on `taxonomy_term_data`. 

It provides two functions, one to get the next term, and one to get the previous. 

The idea is to select the next ( or previous ) term in the same vocabulary with a weight greater ( or less than ) than current term, ordered by weight and limited to one result. A static cache is used so query only performed once per page load.

    /**
     * Return next term id by weight
     * @param $term taxonomy term object
     * @return int term id or FALSE if none exists
     */
    function EXAMPLE_next_term($term) {
    
      // Use static cache
      $next = &drupal_static(__FUNCTION__ . '_' . $term->tid, FALSE);
      
      if(!$next){
        $next = db_select('taxonomy_term_data', 'td')
          ->fields('td', array('tid'))
          ->condition('weight', $term->weight, '>')
          ->condition('vid', $term->vid)
          ->orderBy('weight')
          ->range(0,1)
          ->execute()
          ->fetchField();
      } 
       
      return $next;
        
    }
    
    /**
     * Return previous term id by weight
     * @param $term taxonomy term object
     * @return int term id or FALSE if none exists
     */
    function EXAMPLE_previous_term($term) {
    
      // Use static cache
      $previous = &drupal_static(__FUNCTION__ . '_' . $term->tid, FALSE);
    
      if(!$previous){
      $previous = db_select('taxonomy_term_data', 'td')
        ->fields('td', array('tid'))
        ->condition('weight', $term->weight, '<')
        ->condition('vid', $term->vid)
        ->orderBy('weight')
        ->range(0,1)
        ->execute()
        ->fetchField();
      }
        
      return $previous;
      
    }

Example usage:

    if($tid = EXAMPLE_next_term($term)){
      $next_term = taxonomy_term_load($tid); // Load full term
      $link = l($next_term->name, 'taxonomy/term/'.$next_term->tid);
    }