You can generate a private key by rolling dice and entering the result at bitaddress.org.
How do I make a wallet using dice? What is B6?
An important part of creating a Bitcoin wallet is ensuring the random numbers used to create the wallet are truly random. Physical randomness is better than computer generated pseudo-randomness. The easiest way to generate physical randomness is with dice. To create a Bitcoin private key you only need one six sided die which you roll 99 times. Stopping each time to record the value of the die. When recording the values follow these rules: 1=1, 2=2, 3=3, 4=4, 5=5, 6=0. By doing this you are recording the big random number, your private key, in B6 or base 6 format. You can then enter the 99 character base 6 private key into the text field above and click View Details. You will then see the Bitcoin address associated with your private key. You should also make note of your private key in WIF format since it is more widely used.
That's essentially what I do, although on an air-gapped system of course.
Roll a die 99x or flip a coin 256x. For a die you just convert the 6 to a 0 and you can plug it right into bitaddress. For the coin toss choose whether heads is going to be a 1 or a 0. I think I tried to input binary on bitaddress and it didn't work properly, but anyway it's probably just quicker to convert it to hex before inputting it anyway. There are simple guides on how to do it manually or you can always use that air-gapped system to compute it as well.
I've done it many times and will continue to do so. Unfortunately, going from private to public key then public key to address is never going to happen with pen and paper. That's okay though! I've come to terms with it.
You could also use a segwit address. I've been eyeing
https://segwitaddress.org/bech32 and will try to make a bech32 paper wallet soon.