You can go a long way with modifiers..
- Create a thread/shaft profile (here, the shaft will be down the X axis, left to right).
- Assign the sharp vertex to a vertex group. I've called mine 'Pitch'
- Assign a Screw modifier to the object, along the X axis. Adjust so the profile turns merge. At this point, It will be an un-tapered shaft with threads of even depth.
- Now assign a Simple Deform > Taper modifier, aimed at the 'Pitch' vertex group, to taper the threads without tapering the shaft. (The first, illustrated)
- .. and assign a second Taper modifier with no vertex group to further taper the shaft and threads together.
IMO, the behaviors of the Simple Deform modifiers are pretty painful. I'd recommend practicing with Simple Deform > Taper on a subdivided plane, to get the feel of it.
I would expect the modifier's limits to be defined solely by the modified object's bounding box in the dimension of interest; that there would be no effect negative of the lower limit set in the modifier. But this is not the case. The way to get it to behave is to put the modifier's origin at the set lower limit, as well. Above, the unmodified Y dimesion of the plane was 3, the taper is set to start at .2 of the X dimension, and the modifier's origin has been placed there too.
You can further assign Bevel by angle, Sub-d modifiers further down the stack.
Obviously the object will need further patching up after applying the modifiers, to make it manifold, and ready for printing.
After applying the modifiers, if the Screw vertices have merged properly, the egdes/faces running along the helix are on single loops, so screws are easier to edit than you might think.