.NET Framework 4.6以降ではArray.Empty<T>メソッドを使うことでも空の配列を取得することができます。 それより前のバージョンでは、Emumerable.Emptyメソッドの戻り値に対してToArrayメソッドを呼び出すことで空の配列を作成することができます。

Array.Emptyメソッド・Enumerable.Emptyメソッドを使って空の配列を作成する
using System;
using System.Linq;

class Sample {
  static void Main()
  {
    // Array.Emptyメソッドを使って空の配列を取得する(.NET Framework 4.6以降)
    string[] arr1 = Array.Empty<string>();
    int[] arr2 = Array.Empty<int>();

    // Enumerable.Emptyメソッドを使って空の配列を作成する(.NET Framework 3.5以降)
    string[] arr3 = Enumerable.Empty<string>().ToArray();
    int[] arr4 = Enumerable.Empty<int>().ToArray();
  }
}

呼び出される回数が膨大で配列の生成コストが無視できないようなメソッドや、使用可能なメモリが極端にシビアな実行環境などでは、空の配列を都度作成・取得するよりも、あらかじめキャッシュしておいたインスタンスを使用するようにするか、Type.EmptyTypesのようにあらかじめ用意された空の配列を使用することでパフォーマンスを向上させることができます。

Array.Emptyメソッドが常にキャッシュされたインスタンスを返すかどうか、呼び出しの度に空の配列のインスタンスを作成するのかどうかについてはドキュメントには明記されていません。

一方、Emumerable.Emptyメソッドでは以下のように記載されているため常にキャッシュされた空のシーケンスを返すことが保証されています。

Empty<TResult>() メソッドは、TResult 型の空のシーケンスをキャッシュします。

Enumerable.Empty<TResult> メソッド ()

しかし、Enumerable.Empty<T>().ToArray()の呼び出しでは、ToArrayメソッドが空のシーケンスから配列の作成を行うため呼び出しの度に空の配列のインスタンスが作成されます。