Thanks!
All three can be solved with Snowpark UDF. You can create a my_call UDF function (see https://docs.snowflake.com/en/developer-guide/snowpark/python/creating-udfs.html) and execute it from your DBT model via SELECT my_call().
I think that this is a tradeoff between the benefit and complexity of adding a new tool to your pipeline. If you need to just execute one Python script, the UDF way might be simpler. If you need to do a lot of integrations like this, you better of using orchestration like Airflow or Dagster. Just my $0.02.