What is the need to have the Unicode class? Why is it necessary to have the Unicode class?

What does Unicode::strtoupper() or Unicode::strtolower() do that cannot be done just using native the PHP functions strtoupper() or strtolower()?
The reasons to have its own replacement of strtoupper and strtolower() is to support multi-bytes string in those sites where the Multibyte String extension is installed, and in those sites where that extension is not installed. 

strtoupper() and strtolower() don't support multi-byte strings. Even in the case Drupal would not try to use the Multibyte String extension when installed, Unicode::strtoupper() and Unicode::strtolower() would not be reduced to simply calls to strtoupper() and strtolower(). Their code would probably be the following one.

public static function strtoupper($text) {
  // Use C-locale for ASCII-only uppercase.
  $text = strtoupper($text);
  // Case flip Latin-1 accented letters.
  $text = preg_replace_callback('/\xC3[\xA0-\xB6\xB8-\xBE]/', '\Drupal\Component\Utility\Unicode::caseFlip', $text);
  return $text;
}




public static function strtolower($text) {
  // Use C-locale for ASCII-only lowercase.
  $text = strtolower($text);
  // Case flip Latin-1 accented letters.
  $text = preg_replace_callback('/\xC3[\x80-\x96\x98-\x9E]/', '\Drupal\Component\Utility\Unicode::caseFlip', $text);
  return $text;
}


If Drupal required the Multibyte String extension to be present, then Unicode::strtoupper() and Unicode::strtolower() would not be necessary, since Drupal would use directly mb_strtoupper() and mb_strtolower().

That is not different from what happened in previous versions, except they implemented drupal_strtouppper() and drupal_strtolower(). If you look at the code, it is not much different.

function drupal_strtoupper($text) {
  global $multibyte;
  if ($multibyte == UNICODE_MULTIBYTE) {
    return mb_strtoupper($text);
  }
  else {
    // Use C-locale for ASCII-only uppercase
    $text = strtoupper($text);
    // Case flip Latin-1 accented letters
    $text = preg_replace_callback('/\xC3[\xA0-\xB6\xB8-\xBE]/', '_unicode_caseflip', $text);
    return $text;
  }
}




public static function strtoupper($text) {
  if (static::getStatus() == static::STATUS_MULTIBYTE) {
    return mb_strtoupper($text);
  }
  else {
    // Use C-locale for ASCII-only uppercase.
    $text = strtoupper($text);
    // Case flip Latin-1 accented letters.
    $text = preg_replace_callback('/\xC3[\xA0-\xB6\xB8-\xBE]/', '\Drupal\Component\Utility\Unicode::caseFlip', $text);
    return $text;
  }
}