I would go with #1, if there is an appropriate (not heavy) resizing module and would limit the size of userpics to up to 1000px (need to check specific dimensions and reasons behind that, for example Facebook recommends to have 720px, 960px or 2048px size images, but I don’t see a logical reason behind that).
In #2 imagine what happens when 1000 users start to resize their photos altogether?
Ah, right… Well, if there is a decent client-side solution I would go with it, but if for some reason it is not available, then with #3 and only then would think about loading the server…
Regarding the image size. For example on this forum a basic userpic is 45x45px but then if you click on a username you see a 120x120px image. But there is no other bigger userpic stored anywhere (like in Facebook or LinkedIn). If this is enough from design stand point, I would just limit to 120px then.
It’s definitely tough when you’re on a budget. For us, the flexibility of passing params in the url to get the image you need is worth the cost. If you find yourself exploring things like imagemagick, I’d definitely weigh the cost/benefits of a service like imgix. Also, you don’t have to worry about things like image size, as a user could upload a “profile” image that was 2000x2000 and you can have 50 different versions of it displayed all for the price of the master image.