Боже упаси, где вы такую ахинею то прочли? Первое, нет никаких проверок перед вызовом метода, ибо указатель на него в принципе не может быть null, адрес метода уже известен на этапе компиляции. В IL есть две инструкции call и callvirt, первая служит для вызовов статических и не виртуальных методов, вторая, как раз для вызова виртуальных методов. Виртуальные методы явно помечаются virtual. Вызов виртуального метода более накладные, тем, что перед вызовом необходимо явно определить тип объекта и найти указатель на метод в его таблице виртуальных методов, у не виртуального, адрес метода уже известен на этапе компиляции.
Статический экземпляр класса это фактически другой объект, с другими полями и методами.
Я бы порекомендовал бы вам, первое - снести решарпер (подозреваю, у вас нет лицензии на него), ибо он больше отвлекает своими рекомендациями, второе - выучить шарп для начала, а потом в дебри clr залазить.
PS. Посидел тут в sharplab. Оказывается и для вызова методов экземпляра используется callvirt. И главное, чем он отличается. Проверяет указатель на экземпляр класса, а не указатель на метод. Но JIT так дико код оптимизирует, что, например, если есть явная инициализация объекта и его использование, то проверки выкидываются из кода, а то и функция может заинлайниться. Да и проверка состоит из одной команды процессора. Проверка на null делается в первом вызове метода, в остальных ее нет, при условии, что переменная не изменялась.