例えば、実行ファイルのあるディレクトリを取得したい場合に以下のように書いたとします
var directoryPath = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location);
そうすると、以下のように波線が表示され、 null 参照の可能性があるものの逆参照です。 という警告がでます

つまり、Assembly.GetEntryAssenbly()がnullを返す可能性があり、nullの時に .Location するとエラーになるという話です。
こういった場合に、Null条件演算子を記載しておくと、nullだった時その先のメソッドやプロパティを
実行せずにnullを返してくれエラーの回避をしてくれます
var directoryPath = Path.GetDirectoryName(Assembly.GetEntryAssembly()?.Location);
↓
var directoryPath = Path.GetDirectoryName(null); // これと同等
※Path.GetDirectoryNameはnullを受け取った場合そのままnullを返してくれてエラーにはならないです
パスなのでnullを返されても・・・というのはあると思うので、Null合体演算子を使って空文字にしてしまうのでもよいですね
var directoryPath = Path.GetDirectoryName(Assembly.GetEntryAssembly()?.Location) ?? "";
もうちょっと極端なケースをみるとその恩恵が強く感じられるのかもしれないのでそんな例を
たとえばあるクラスのメソッドをつなげて実行できる場合に、そのメソッドがnullを返す恐れがあると
それ以降のメソッドでエラーになるのでNull合体演算子を使うことになるのですが
var ret = new Hoge();
var val = ret.Foo()?.Bar()?.Baz();
これをNull合体演算子を使わないでかくと…
以下のようになり見づらくなってしまうって話しになります
var ret = new Hoge();
var val = ret.Foo();
if(val != null)
{
val = val.Bar();
if (val != null)
{
val = val.Baz();
}
}