I think this is by design.
Let's look at the differences in the templates for klarna and paypal.
Klarna is rendered by the template vendor/klarna/module-kp/view/frontend/web/template/payments/kp.html
which has this section
<div class="payment-method-billing-address">
<!-- ko foreach: $parent.getRegion(getBillingAddressFormName()) -->
<!-- ko template: getTemplate() --><!-- /ko -->
<!--/ko-->
</div>
getBillingAddressFormName
is a function in the default payment method renderer vendor/magento/module-checkout/view/frontend/web/js/view/payment/default.js
which returns 'billing-address-form-' + this.item.method
so a static text plus the name of the payment method.
In this region, the billing address form is added from Magento\Checkout\Block\Checkout\LayoutProcessor::process
method (dig deeper in that class and you end up in the method getBillingAddressComponent
where you see 'displayArea' => 'billing-address-form-' . $paymentCode
).
We can talk about how this works for a few hours but the short story is that the billing address form is added to all the payment methods in a specific area and then the method template can decide if it displays it or not and where to display it.
Now let's look at the paypal express method.
This is rendered by the template vendor/magento/module-paypal/view/frontend/web/template/payment/payflow-express.html
.
This does not contain any trace of the text <!-- ko foreach: $parent.getRegion(getBillingAddressFormName()) -->
so it does not render the billing address form.
The only paypal payment methods that display the form are:
- payflowpro (template
vendor/magento/module-paypal/view/frontend/web/template/payment/payflowpro-form.html
)
- iframe (template
vendor/magento/module-paypal/view/frontend/web/template/payment/iframe-methods.html
)
- paypal billing agreement (template
vendor/magento/module-paypal/view/frontend/web/template/payment/paypal_billing_agreement-form.html
)
If you are using one of these 3 methods and you don't get the billing address form it means I'm wrong and all I wrote above means nothing.
But if I'm right and this is "by design", I cannot answer the question to "why it is like this." Could be what fmsthird said in the comment above