The plot is sped up substantially if you use `Evaluate`:

      ParametricPlot[
          Evaluate[ Total@MapIndexed[NBSpline[First@#2 - 1, p, knots, u] #1 &, pts]] ,
               {u, a, b}, opts]

(I only looked a trial 1 , but I think your other try have the same issue )

It helps a little more if you remove the `Simplify` from `NBSpline` and simplify the whole thing:

     ParametricPlot[
           Evaluate[Total@
                 MapIndexed[NBSpline[First@#2 - 1, p, knots, u] #1 &, pts] // 
                      Simplify], {u, a, b}, opts]

Your original form is a sum of piecewise expressions.  The outer `Simplify` condenses the whole thing into a single piecewise.

The gaps seem to relate the nature of the discontinuity in derivatives of the bspline w/ respect to its parameter at the knots, which evidently fools `Parametric Plot` into thinking there is an actual discontinuity.  
 
The gaps close with `PlotPoints -> 1000` , though if you look at the graphics produced you'll see you still have separate `Line`s for each portion.  I don't think there is anything to do about that except not use `ParametricPlot`.



You might try doing away with  `ParametricPlot` and doing   `Graphics@Line@Table .. `,
which may speed it up as well.