Show transparent viewport image (via script)
Your second idea works!


Use the "Import images as planes" option (activate addon in preferences) or make Empty and set display as image.
Then make a dummy camera and parent it (keep transform) to you image plane
Activate textured view and make sure that in Materials -> Settings you set Blend mode to "Alpha blend" (or use alpha is activated if you used an Empty as Image)
You can use +/- to zoom camera border, so its no longer in view. (changing the zoom here works only while camera not locked to view)
Make the plane "unselectable" (by clicking cursor symbol in Outliner) otherwise you will always select the plane if locked to view ;)
Finally activate "Lock Camera to view"


And you're done!
Here is my implementation:


+

Here is the same procedure in Code:
PS: However there is a small TODO section for setting the 3d view to the Camera view in script, which i havent quite figured out how to do yet

import bpy
from mathutils import Euler ##For Rotations

######Deletes all Objects in default blender startup
bpy.ops.object.select_all(action='SELECT') 
bpy.ops.object.delete(use_global=False)
######
########### Make Objects you need: Camera-Dummy and Empty as Image (and set it as parent)

imgEmpty = bpy.data.objects.new("myImgEmpty", None)
scene = bpy.context.scene
bpy.context.collection.objects.link(imgEmpty)
imgEmpty.location = (0, 0, -1.5)
imgEmpty.rotation_euler = Euler((0, 0, 0), 'XYZ') 
imgEmpty.empty_display_type = 'IMAGE'
imgOverlay = bpy.data.images.load("C:/Users/robert/Desktop/Installers/2019/blender-2.80.0-git.d30f72dfd8ac-windows64/TestOverlay.png", check_existing=True) ##### CHANGE PATH !!!
imgEmpty.data = imgOverlay

bpy.ops.object.camera_add(location=(0, 0, 0), rotation=(1.5708, 0, 0)) ##90deg in radian
dummyCamera = bpy.context.view_layer.objects.active
layer = bpy.context.view_layer
layer.update()

imgEmpty.parent = dummyCamera

###########
################ Set 3d view to Camera view and Zoom

   #TODO ;)

################
##################### Set camera to Lock camera to view and Set 3d View to Textured view
for area in bpy.context.screen.areas:
   if area.type == 'VIEW_3D':
      for space in area.spaces:
         if space.type == 'VIEW_3D':
            space.lock_camera = True
            space.shading.type = 'MATERIAL'
#####################


Happy Blending!