If there is difference between the sound of [triangle~] and VarSaw, it might actually be in the way phase is generated. The algorithms themselves are pretty much the same, but while VarSaw makes its own single-precision phase by simply subtracting 1 when an increment takes it past 1.0 (using a conditional on each sample), [triangle~] is a waveshaper that is fed phase. Pd's phasor is a little idiosyncratic, using a kind of bit-hacking to unwrap phase (the Höldrich method), which is supposed to perform a bit faster than a conditional, and it's inside not just [phasor~] but all the oscillator objects. If I remember correctly it can be prone to phase drift over time, but don't quote me on that.