Does sending the "max amount" with given feerate require crafting the transaction twice? To make a transaction of &quot;max amount&quot; with a given feerate, is there a shorter procedure than the following?

Craft transaction with with one output
Sign it
Consider the signed length - multiply it with the feerate
Subtract the difference
Set the dest amount
Re-sign it
No, you shouldn't need to sign the transaction until it's completely crafted. Bitcoin core can handle this for you!
An easier flow when creating a transaction is

Create raw transaction. Don't add any inputs yet.
Fund raw transaction. This will select inputs for you. Add subtractFeeFromOutputs of the output you want to subtract the final fee from. The docs on subtractFeeFromOutputs is a bit confusing, but it wants you to specify which output(vout) the fee should be deducted from. If you specify multiple outputs, the fee is spread equally across the outputs. Bitcoin core will amend the amount in the output(s) you specified.
Sign your raw transcation. Voila, you're done!