32bitと64bitのDllImport動的切り替えで、どうやって呼び出し先を選択するかと言えば、抽象メソッドと継承を使うかifで呼び分けるかの選択肢がありますが、今回、どちらが早いか実験してみたのでメモしておきます。

1.仮想メソッド方式
メソッドを定義した抽象クラスと、それを呼び出し先DLLごとに分けたサブクラスを作成し、プログラム初期化時に適切な方をnewしてそれを呼び出します。

class Program {
    public static void Main() {
        BaseClass dll;

        if (IntPtr.Size == 4)
            dll = new SubClass32();
        else
            dll = new SubClass64();

        dll.method(); // 呼び出し
    }
}

abstract class BaseClass {
    public abstract void Method1();
}

class SubClass32 : BaseClass {
    public override void Method1() => method(); // ラムダ実装。C#6.0から利用可能

    [DllImport("パス32.dll")]
    static extern void method();
}

class SubClass64 : BaseClass {
    public override void Method1() => method(); // ラムダ実装。C#6.0から利用可能

    [DllImport("パス64.dll")]
    static extern void method();
}

2.if分岐方式
現在の実行環境が32bit、64bitのどちらかを呼び出し時に判定して分岐する方式です。

class Program {
    public static void Main() {
        // 呼び出し
        if (IntPtr.Size == 4)
            method32();
        else
            method64();
    }

    [DllImport("パス32.dll", EntryPoint = "method")]
    static extern void method32();
    [DllImport("パス64.dll", EntryPoint = "method")]
    static extern void method64();
}

結果は、「if分岐方式」の方が早かったです。
呼び出し処理をそれぞれ100000000回実行した場合の時間を比較したところ、前者は229.6516msだったのに対し、後者は38.5251msだったので結構な差だと思います。

仮想メソッド方式は管理が楽ですが、やはり無駄な処理も増えてしまうようです。
もし32/64bitのDLL呼び出し分けをするならif分岐方式を採用した方がいいと思われます。
ちなみに、if分岐方式でIntPtr.Sizeを静的フィールドにキャッシュしてそれを使った場合、差はほとんどありませんでした。