The curve won't have a continuous derivative, which may sound weird if the curve is played slow enough. If ever your solution is not sufficient, it might be better to try to come up with the integral of some continuous function, but it may be a bit hard to make it align with the desired frequencies.
for wide vibratos, it's also important to ask yourself which scale you want to work in: linear vs logarithmic sound different for any sufficiently wide vibrato.
[osc~ vibrato_rate] | [expr~ ($v1>0)*$f2*$v1+($v1<0)*$f3*$v1]
how about? [expr~ ($v1+1)/2*$f3*$v1-($v1-1)/2*$f2*$v1]
It's cheap/quick, but it has the continuous 1st derivative you mentioned... I just tried it and it sounds alright.... doesn't do anything too weird/unexpected :) Also, it doesn't change the location of the zeros, or otherwise affect the duty cycle of the thing. The two parts ($v1+1)/2 and -($v1-1)/2 are just mixing functions that always add up to 1. There's probably lots of variations that would work as well or better, while still being continuous.