To improve performance in a similar situation where I needed to add a fee based on driving distance between origin and destination for the purchased items (we're talking truckloads, not parcels, so the built-in NetSuite shipping stuff doesn't work), I had the backend geolocation service (based on latlong of address book entries rather than IP address in my case) store the driving distance calculated by the 3rd party service, on custom fields and/or records associated with the customer, triggered to run (or schedule to run) this record upsert whenever address book entries or Location record changes.
That way the performance hit is limited to NetSuite looking it up in its own database, but it's always up to date.
Your customer's current IP address may be temporary and change with use of different devices, traveling, and/or use of VPNs. But maybe that's what you want.
Additional optimization could maybe be done using the N/cache module.
I think it's key that you said Price Level and not Price amount. This implies that the price levels are already set, it just needs to select the right one. what's the scope of how many price levels there could be to have to automatically choose between? This might be simpler than I thought, depending on that.
Whatever method you use, then there's the vital question of at what point you script the price level change into the shopping or checkout processes. I think for most use cases you'll need to program a SuiteCommerce extension (if using SuiteCommerce Standard) to get it to keep up to date in the shopping cart before checkout is completed. If you use a UserEvent script when the checkout is completed (the order is placed), then the price change won't show up until after they already ordered, which would be misleading in most use cases.