I figured out the answer to my own question. Yes, it's possible.
The contract expects only the "object" value of the "bytecode" structure provided by Remix. Currently, when you click to copy the "bytecode" from Remix, you end up with a structure that looks like this:
bytecode = {
'linkReferences':[],
'object': '6080604052336000806...',
'opcodes': 'PUSH1 0x80...',
'sourcemap': '50:1984:0:-;;;2...'
}
I was passing this whole structure as the bytecode argument, which is wrong. The Contractcontract is expecting only expecting the "object" value to be provided to it as the bytecode argument.