Update 2021: This answer is no longer needed.  See accepted answer for details.
Here's what I was able to do after Fabio's great suggestion.
Create a program called /usr/local/bin/runPy3M with world read/execute permissions, with the following code:
#!/usr/local/bin/python3 -u
'''
Run submodules inside packages (with relative imports) given
a base path and a path (relative or absolute) to the submodule
inside the package.
Either specify the package root with -b, or setenv ECLIPSE_PROJECT_LOC.
'''
import argparse
import os
import re
import subprocess
import sys
def baseAndFileToModule(basePath, pyFile):
    '''
    Takes a base path referring to the root of a package
    and a (relative or absolute) path to a python submodule
    and returns a string of a module name to be called with
    python -m MODULE, if the current working directory is
    changed to basePath.
    Here the CWD is '/Users/cuthbert/git/t/server/tornadoHandlers/'.
    >>> baseAndFileToModule('/Users/cuthbert/git/t/', 'bankHandler.py')
    'server.tornadoHandlers.bankHandler'
    '''
    absPyFilePath = os.path.abspath(pyFile)
    absBasePath = None
    if basePath is not None:
        absBasePath = os.path.abspath(basePath)
        commonPrefix = os.path.commonprefix([absBasePath, absPyFilePath])
        uncommonPyFile = absPyFilePath[len(commonPrefix):]
    else:
        commonPrefix = ""
        uncommonPyFile = absPyFilePath 
    if commonPrefix not in sys.path:
        sys.path.append(commonPrefix)
    moduleize = uncommonPyFile.replace(os.path.sep, ".")
    moduleize = re.sub("\.py.?$", "", moduleize)
    moduleize = re.sub("^\.", "", moduleize)
    return moduleize    
def exitIfPyDevSetup():
    '''
    If PyDev is trying to see if this program is a valid
    Python Interpreter, it expects to function just like Python.
    This is a little module that does this if the last argument
    is 'interpreterInfo.py' and then exits.
    '''
    if 'interpreterInfo.py' in sys.argv[-1]:
        interarg = " ".join([sys.executable] + sys.argv[1:])
        subprocess.call(interarg.split())
        exit()
    return
exitIfPyDevSetup()
parser = argparse.ArgumentParser(description='Run a python file or files as a module.')
parser.add_argument('file', metavar='pyfile', type=str, nargs=1,
                   help='filename to run, with .py')
parser.add_argument('-b', '--basepath', type=str, default=None, metavar='path',
                   help='path to directory to consider the root above the package')
parser.add_argument('-u', action='store_true', help='unbuffered binary stdout and stderr (assumed)')
args = parser.parse_args()
pyFile = args.file[0]
basePath = args.basepath
if basePath is None and 'ECLIPSE_PROJECT_LOC' in os.environ:
    basePath = os.environ['ECLIPSE_PROJECT_LOC']
modName = baseAndFileToModule(basePath, pyFile)
allPath = ""
if basePath:
   allPath += "cd '" + basePath + "'; "
allPath += sys.executable
allPath += " -m " + modName 
subprocess.call(allPath, shell=True)  # maybe possible with runpy instead...
Then add a new interpreter to PyDev -- call it what you'd like (e.g., runPy3M) and point the interpreter to /usr/local/bin/runPy3M.  Click okay.  Then move it up the list if need be.  Then add to environment for the interpreter, Variable: ECLIPSE_PROJECT_LOC (name here DOES matter) with value ${project_loc}.
Now submodules inside packages that choose this interpreter will run as modules relative to the sub package.
I'd like to see baseAndFileToModule(basePath, pyFile) added to runpy eventually as another run option, but this will work for now.
EDIT: Unfortunately, after setting all this up, it appears that this configuration seems to prevent Eclipse/PyDev from recognizing builtins such as "None", "True", "False", "isinstnance," etc.  So not a perfect solution.